上传:
要求:1.表单的method必须是post
2.表达增加enctype="multipart/form-data"
3.input标签的type属性的值是file
Servlet具体方法:
1.创建工厂:DiskFileItemFactory=new DiskFileItemFactory();
2.创建解析器:ServletFileUpload sfu=new ServletFileFactory(factory);
3.使用List<FileItem>从解析器得到文件:List<FileItem> list=sfu.ParseRequest(request);
4.可以根据FileItem的getName()得到文件的名称:FileItem fl=list.get(index); String filename=fl.getName();
5.保存文件:File file=new File("文件路径");
6.fl.write(file);
=================================================
基本步骤大致如此
=================================================
但是----------------》》》》》》》
我们需要考虑一些细节:
1.上传文件的编码问题 有两种方式可以解决:
1):request.setCharacterEncoding("utf-8");
2):通过解析器的sfu.setHeaderEncoding("utf-8")方法解决 注意:当同时采取两种方法时,fu.setHeaderEncoding("utf-8")具有优先级,会覆盖 request.setCharac terEncoding("utf-8");
2.由于用户上传的文件带有路径,如何截取文件的名字呢? 通常在用户上传文件时会带有路径,比如:F:/demp/file/movies/AAA.txt,那么我们就只需要AAA.txt而不需要之前的信息,解决方法如下:
比方说我们保存F:/demp/file/movies/AAA.txt的变量为filename,那么 int index=filename.lastIndexof("\\");[此刻请注意是"\\",切记!] if(index!=-1){ filename=filename.substring(index+1); }
3.保存文件的时候保存的位置 首先我们不可能直接把文件保存在自己的磁盘上吧!不要问我为什么。肯定是要放在服务器上的,那么我们应该保存在哪里呢?最好是在WEB-INF目录下新建一个文件夹,比如说是files,切不可保存在webroot下,理由:不想说,但是我期待你这样做!! 如何保存呢?可以这样: String root=this.getServletContext().getRealPath("/WEB-INF/files/");
4.当用户上传的文件过大时,如何处理难点直接保存在服务器? 在本次磁盘上建立一个临时的文件夹,用于临时保存用户的文件,当文件上传文件成功后服务器会自动将其保存到files里面。
实现方法:DiskFileItemFactory factory=new DiskFileItemFacoty(1024*10,new File("F:/temp"));
注意:1024*10表示上传的文件超过了10kb的时候就会放到临时文件夹,否则不会,可以随便改的,10KB也是默认的 new File("F:/temp")就不用说了吧,,,指定临时文件夹 4.如何对用户上传的文件大小限制 可以用解析器sfu的sf.setFileSizeMax(fileSizeMax)和sf.setSizeMax(fileSizeMax)方法解决,前者是单个文件限制,后者是表单文件大小限制
5.保存文件的时候如何处理同名问题 一般是在文件名的前面加上一个前缀,前缀肯定是唯一的嘛。具体实现自己看着办啊
6.文件的储存方式(不能在一个文件夹储存过多文件,否则会卡的,如果不信可以把你电脑的文件全部放在一个文件夹试试,你就慢慢打开吧) 我之前是在WEB-INF下建立了一个files文件夹,但是不能所有的文件都放在这里吧,
我们通常有两种方法处理此类问题:
1.时间打散:
2.哈希打散
由于本次项目我使用的是哈希打散,所以我详细的介绍一下这个方法:
1).int code=filename.hashcode();//根据文件名称得到一个int类型的数字 String hex=Integr.setHexString(code);//根据该数字得到一个16进制的字符串
2).根据创建的files文件夹和hex随机生成文件夹,比如是两个级别的文件夹: File dirFile=new File(root,hex.charAt(0)+"/"+hex.charAt(1));(root是第三步写的,没注意可以看)
3).然后执行dirFile.mkdirs()方法,创建多个文件夹【注意是mkdirs()不是mkdir(),区别不解释】
4).File deskFile=new File(dirfile, 有前缀的文件名);
5).最后,保存:file.write(deskFile);//保存
下载:
记住一句话:两个头一个流
两个头:
Content-Type:
/*获取文件的MIME类型*/
String contentType=this.getServletContext().getMimeType(filename);
Content-Dispostion: String contentDisposition="attachmentDisposition;filename="+filename;
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Disposition", contentDisposition);
一个流:文件流 FileInputStream input=new FileInputStream(file);
步骤就不说了,最后记得关闭流就可以了!!!