文件上传

来源:互联网 发布:金山毒霸手机数据恢复 编辑:程序博客网 时间:2024/06/03 20:38

文件上传需要注意:

  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");
原创粉丝点击