JavaWeb文件上传基础

  1. 进行文件上传时,表单需要做的准备:
    1)请求方式为POST
    2)在表单中使用表单元素<input type="file" />,则浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
    3)使用 multipart/form-data 的请求编码方式

    <form action="uploadServlet" method="post" enctype="multipart/form-data">
        File: <input type="file" name="file" />
        <input type="submit" value="Submit" />
    </form>

    4) 关于 enctype:

    ① application/x-www-form-urlencoded:表单enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用“%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非ASCII 字符的文本来说,这种编码不能满足要求。
    ② multipart/form-data:form 中 enctype元素设定了该值后,表示表单以二进制传输数据。

  2. 服务端
    1)不能再使用request.getParameter()等方式获取请求信息,获取不到,因为请求的编码方式已经改为 multipart/form-data,以二进制的方式来提交请求信息。
    2)可以使用输入流的方式来获取,但不建议这样做。
    3)Apache 为我们提供了一个 commons-fileupload 组件来完成文件的上传操作。


  1. 如何使用commons-fileupload 组件来完成一个文件上传
    1)环境搭建:加入 commons-fileupload-1.2.1.jar 和commons-io-2.0.jar
    2 ) 基本思想:

    ① commons-fileupload 可以解析请求,得到FileItem 对象组成的 List
    ② commons-fileupload 把所有的请求信息都解析为FileItem 对象,无论是一个一般的文本域还是一个文件域。
    ③ 可以调用 FileItem 的 isFormFiled() 方法来判断该FileItem 对象是一个表单域(true)或不是一个表单域(则是一个文本域)
    ④ 可以再进一步获取信息:

    if(item.isFormField){
        String name = item.getFieldName();
        String value = item.getString();
    }
    if(!item.isFormField){
        String fieldName = item.getFieldName();
        String fileName = item.getName();
        String contentType = item.getContentType();
        boolean isInMemory = item.isInMemory();
        long sizeInBytes = item.getSize();
    
        InputStream uploadedStream = item.getInputStream();
        ...
        uploadedStream.close();
    }

    如何得到 List<FileItem> 对象?

    //DiskFileItemFactory 工厂类 默认实现FileItemFactory接口
    FileItemFactory factory = new DiskFileItemFactory();
    
    //ServletFileUpload对象用于解析request,能从request中解析出装有FileItem对象的一个List
    ServletFileUpload upload = new ServletFileUpload(factory);
    
    List<FilItem> items = upload.parseRequest(request);     

    可以为文件的上传加入一些限制条件和其他的属性:

    FileItemFactory factory = new DiskFileItemFactory();
    
    //设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时文件夹中,以byte为单位
    factory.setSizeThreshold(yourMaxMemorySize);
    //设置那个临时文件夹
    factory.setRepository(yourTempDirectory);
    
    ServletFileUpload upload = new ServletFileUpload(factory);
    
    //设置上传文件的总的大小,也可以设置单个文件的大小
    upload.setSizeMax(yourMaxRequestSize);
    
    List<FilItem> items = upload.parseRequest(request);     
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值