文件上传
1.普通表单提交默认enctype=”application/x-www-form-urlencoded”;但是当表单中存在文件类型时,需要设置enctype=”multipart/form-data”,它不对字符进行编码,用于发送二进制的文件(即所有文件类型,如视频、图片、音乐、文档都可以用此类型entype);还有一种enctype=”text/plain”用于发送纯文本内容。
2.表单请求方式必须为post。
3.接收时不能再用request.getParameter(),而是request.getInputStream()解析二进制流,得到ServletInputStream对象。





当我们使用request.getInput直接获取到的字节流,后续进行打印数据的时候。会自动加上许多表单,文件的属性和属性值,还有分隔符。上传的是纯文本文件时,打印出来还能看到清除文件内容。但当上传的是非文本文件的时候,自动加上的属性和属性值,会导致文件不能正常显示。这时候我们就需要解析request.getInpustream()。
FileUpload文件上传
FileUpload是apache的commons组件提供的上传组件,它最主要的工作就是帮我们解析request.getInpustream()。可以参考在线API文档:http://tool.oschina.net/apidocs/apidoc?api=commons-fileupload
使用fileUpload组件首先需要引入两个jar包
- commons-fileUpload.jar
- commons-io.jar

fileUpload的核心类有DiskFileItemFactory、ServletFileUpload、FileItem。
使用fileUpload固定步骤:
- 创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory();
- 创建解析器:ServletFileUpload upload=new ServletFileUpload(factory);
- 使用解析器解析request对象:List list=upload.parseRequest(request);
使用的基本思想:
- commons-fileupload 可以解析请求, 得到一个 FileItem 对象组成的 List
- commons-fileupload 把所有的请求信息都解析为 FileItem 对象, 无论是一个一般的文本域还是一个文件域.
- 可以调用 FileItem 的 isFormField() 方法来判断是一个 表单域 或不是表单域(则是一个文件域)
- 再来进一步获取信息
一个FileItem对象对应一个表单项。FileItem类有如下方法:
- String getFieldName():获取表单项的name的属性值。
- String getName():获取文件字段的文件名。如果是普通字段,则返回null
- String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。
- String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。
- long getSize():获取字段内容的大小,单位是字节。
- boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。
- InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流。
文件名中文乱码处理:
- servletFileUpload.setHeaderEncoding(“utf-8”) 或 request.setCharacterEncoding(“utf-8”);
表单普通字段中文乱码处理:
- new String(str.getBytes(“iso-8859-1”,”utf-8”));
设置内存缓冲区的大小,默认为10KB:
- diskFileItemFactory.setSizeThreshold(1024*1024);
指定临时文件目录,如果单个文件的大小超过内存缓冲区,该文件将会临时缓存在此目录下:
- diskFileItemFactory.setRepository(file);
设置单个文件大小限制,如果有某个文件超过此大小,将抛出FileUploadBase.FileSizeLimitExceededException
- servletFileUpload.setFileSizeMax(1024102410);
设置所有文件,也就是请求大小限制,如果文件总和超过此大小,将抛出FileUploadBase.SizeLimitExceededException
- servletFileUpload.setSizeMax(1024102420);
利用UUID生成伪随机字符串作为文件名避免重复:UUID.randomUUID().toString();
将文件写到硬盘上。写完之后,系统会自动将放在临时文件目录的该文件删除:
- fileItem.write(new File(path,fileName));

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="upd" method="post" enctype="multipart/form-data"> 文件名<input type="text" name="filename"> 文件: <input type="file" name="file"><br> <input type="submit"> </form>
<form action="uploadServlet" method="post" enctype="multipart/form-data"> File: <input type="file" name="file"><br> 文本域: <input type="text" name="text"><br> <input type="submit"> </form>
<form action="uploadServlet" method="post" enctype="multipart/form-data"> 文本域: <input type="text" name="text"><br> <input type="submit"> </form>
</body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| package com.kylin.servlet;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; import java.util.UUID;
@WebServlet("/uploadServlet") public class UploadServlet extends HttpServlet {
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 500); File tempDirectory = new File("C:\\Data\\Log"); factory.setRepository(tempDirectory);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8"); try { List<FileItem> items = upload.parseRequest(req); for (FileItem item : items) { if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString("utf-8");
System.out.println(name + ": " + value); } else { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentype = item.getContentType(); long sizeInBytes = item.getSize();
System.out.println(fieldName); System.out.println(fileName); System.out.println(contentype); System.out.println(sizeInBytes);
String suffix = fileName.substring(fileName.lastIndexOf(".")); String uuid = UUID.randomUUID().toString(); FileUtils.copyInputStreamToFile(item.getInputStream(), new File("C:\\Data\\IDM\\Java学习\\" + uuid + suffix)); } } } catch (FileUploadException e) { e.printStackTrace(); } } }
|