fileupload | servlet 接受文件

form表单提交数据到servlet后,使用fileupload进行接收。
fileupload 是由 apache 的 commons 组件提供的上传组件。它最主要的工作就是帮我们解析 request.getInputStream()。

fileupload 组件需要的JAR包有:

commons-fileupload.jar,核心包;

commons-io.jar,依赖包。

fileupload 简单应用

fileupload的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。

使用 fileupload 组件的步骤

  1. 创建工厂类 DiskFileItemFactory 对象:DiskFileItemFactory factory = new DiskFileItemFactory()

  2. 使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory)

  3. 使用解析器来解析 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);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值