文件上传

文件上传需要注意:

  1. 提交方式:post
  2. 表单中有文件上传的表单项:
  3. 指定表单类型:
    默认类型:enctype="application/x-www-form-urlencoded"

文件上传类型:multipart/form-data

可以使用开源的文件上传组件-Apache提供的文件上传组件-FileUpload组件!

FileUpload组件:

     1. 下载源码
     2. 项目中引入jar文件
                        commons-fileupload-1.2.1.jar  【文件上传组件核心jar包】
                        commons-io-1.4.jar     【封装了对文件处理的相关工具类】

文件上传组件API

     |--FileIteamFactory     文件上传工厂类(把每个请求表单封装为一个个FileIteam对象)
          fac.setRepository( repository )     设置删除临时目录
     |--ServletFileUpload     文件上传核心类:可以获取所有的FileIteam对象
          List parseRequest( response );     获取所有文件上传项
          Boolean isMultipartContent( request )     判断表单类型,文件上传表单,返回true
          upload.setFileSizeMax( fileSizeMax );     设置单个文件的最大值
          upload.setSizeMax( sizeMax );     设置总文件的大小
          upload.setHeaderEncoding("utf-8");      设置上传文件名的编码
                    相当于      request.setCharacterEncoding(...);
     |--FileIteam          封装了普通表单项的值以及文件上传表单的值
          item.getFildName()          获取上传表单名称
          item.getString()               获取上传数据
          item.getString( "utf-8" )     获取上传数据,处理中文
          item.getContentType()     获取上传文件类型【文件项】
          item.getInputStream()     获取文件流【文件项】
          item.getName()          获取文件名【文件项】
          item.write(file)                    写文件
          item.delete( )                    删除临时文件

文件上传处理类

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 1、创建文件上传工厂类
        FileItemFactory fac = new DiskFileItemFactory();
        // 2、创建文件上传核心类对象
        ServletFileUpload upload = new ServletFileUpload(fac);

        // 设置
        // 设置单个文件大小
        upload.setFileSizeMax(30*1024*1024);
        // 设置总文件大小
        upload.setSizeMax(50*1024*1024);

        // 3、判断当前表单是否为文件时上传表单
        if(upload.isMultipartContent(request)){
            try{
                // 3、把请求数据转换为FileItem对象的集合
                List<FileItem> list = upload.parseRequest(request);
                // 遍历得到每一个上传项
                for(FileItem item:list){
                    // 判断是普通表单还是文件上传表单
                    if(item.isFormField()){
                        // 普通表单
                        String fieldName = item.getFieldName();     // 文本框名称
                        String contentType = item.getContentType(); // 文件类型
                        String str = item.getString();              // 文本框中的值

                    }else{
                        // 文件上传表单
                        String fieldName = item.getFieldName();         // 文本框名称
                        String contentType = item.getContentType();     // 文件类型
                        String name = item.getName();                   // 文件名
                        String str = item.getString();                  // 文件中的值
                        InputStream in = item.getInputStream();         // 文件流
                        System.out.println(fieldName+":"+name);
                        System.out.println(in);

                        // 获取文件上传路径
                        String path = this.getServletContext().getRealPath("/upload");
                        File file = new File(path, name);
                        item.write(file);
                        // 删除临时文件
                        item.delete();

                    }
                }
            }catch(Exception e){

            }
        }
    }

文件下载

文件下载时:
1、需要把文件从硬盘以流的方式读入;
2、设置相应头为文件下载

response.setHeader("content-disposition", "attachment;fileName=" + fileName)

3、然后获取response输出流response.getOutputStream,将文件流写入输出流,

注意乱码问题

tomcat默认使用http协议,数据默认传输是使用的是ISO-8859-1编码,上传时文件名存在于post提交的数据中,所以可以使用request.setCharacterEncoding("utf-8");来指定编码格式。

下载时

提交下载的文件名是通过get数据提交的,get数据放在url中,URL使用的编码时ISO-8859-1编码,所以拿到文件名时要进行编码转换

fileName = new String(fileName.getBytes("iso-8859-1"),"utf-8");

下载时需要设置下载的响应头,下载响应头传输时默认使用的是ISO-8859-1编码

// 设置下载的响应头
resp.setHeader("content-disposition", "attachment;fileName=" + fileName);

如果有中文需要转码

// 如果文件名是中文,需要进行url编码
// 使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。
fileName = URLEncoder.encode(fileName, "UTF-8");

或者使用

fileName = new String(fileName.getBytes("utf-8"),"iso-8859-1");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值