form表单提交数据到servlet后,使用fileupload进行接收。
fileupload 是由 apache 的 commons 组件提供的上传组件。它最主要的工作就是帮我们解析 request.getInputStream()。
fileupload 组件需要的JAR包有:
commons-fileupload.jar,核心包;
commons-io.jar,依赖包。
fileupload 简单应用
fileupload的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。
使用 fileupload 组件的步骤
-
创建工厂类 DiskFileItemFactory 对象:DiskFileItemFactory factory = new DiskFileItemFactory()
-
使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory)
-
使用解析器来解析 request 对象:List list = fileUpload.parseRequest(request)
隆重介绍 FileItem 类,它才是我们最终要的结果。一个FileItem对象对应一个表单项(表单字段)。
一个表单中存在文件字段和普通字段,可以使用FileItem类的 isFormField()方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了。
主要方法:
String getName():获取字段的文件名称(原始文件名),普通字段值为null,文件字段为文件的名称;
String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件,如果是普通字段,获得字段的值;
String getFieldName():获取字段名称,例如:,返回的是username;
String getContentType():获取上传的文件的类型,例如:text/plain,如果是普通字段,值为null;
long getSize():获取字段的大小,单位:byte;
boolean isFormField():判断当前表单是否为普通文本字段,如果返回true,说明是普通字段,如果返回false,说明是文件字段;
InputStream getInputStream():获取上传文件对应的输入流,普通字段返回null;
void write(File):把上传的文件保存到指定文件中。
api链接:(http://commons.apache.org/proper/commons-fileupload/javadocs/api-release/index.html)
示例代码:
//创建接收文件的工厂类
2 DiskFileItemFactory factory = new DiskFileItemFactory();
3 //创建文件解析对象
4 ServletFileUpload sfu = new ServletFileUpload(factory);
5 try {
6 //解析request获得表单中的每一文件项(包含普通文本域)
7 List<FileItem> fiList = sfu.parseRequest(request);
8 //遍历每一个文本项
9 for(FileItem fi : fiList){
10 //获得原始文件名
11 String originalFilename = fi.getName();
12 //获得字段的内容
13 //Returns the contents of the file item as a String, using the default character encoding.
14 String content = fi.getString();
15 //获得字段名
16 String field = fi.getFieldName();
17 //获得字段的内容类型
18 String contentType = fi.getContentType();
19 //获得字段大小,以byte为单位
20 long size = fi.getSize();
21 //是否是普通字段
22 //如果true,代表普通字段(a simple form field)
23 //如果false,代表文件字段
24 boolean isFormField = fi.isFormField();
25 System.out.println("原始文件名:" + originalFilename);
26 System.out.println("字段的内容:" + content);
27 System.out.println("字段名:" + field);
28 System.out.println("字段的内容类型:" + contentType);
29 System.out.println("字段大小(单位:byte):" + size);
30 System.out.println("是否是普通字段:" + isFormField);
31 System.out.println("============================");
32 }
33 } catch (FileUploadException e) {
34 e.printStackTrace();
35 }
代码2
public class FileServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -4187075130535308117L;
private boolean isMultipart;
private int maxFileSize = 1024 * 1024 * 10;
private int maxMemSize = 100 * 1024;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 检查是否有一个文件上传请求
isMultipart = ServletFileUpload.isMultipartContent(request);
String result = "";
response.setContentType("text/html;charset=utf-8");
if (!isMultipart) {
result = "未获取到文件";
response.getWriter().println(result);
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// 文件大小的最大值将被存储在内存中
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
String path = getServletContext().getRealPath("/") + "/";
factory.setRepository(new File(path));
// System.out.println(path);
// 创建一个新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
// 允许上传的文件大小的最大值
upload.setSizeMax(maxFileSize);
try {
// 解析请求,获取文件项
List fileItems = upload.parseRequest(request);
// 处理上传的文件项
Iterator i = fileItems.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (!fi.isFormField()) {//过滤非媒体文件,如json
// 获取上传文件的参数
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// 写入文件
File file = new File(path + System.currentTimeMillis() / 1000 + ".py");
fi.write(file);
}
}
result = "上传成功";
} catch (Exception ex) {
System.out.println("ex:" + ex.getMessage());
result = "上传失败";
}
response.getWriter().println(result);
}
}