首页 > 代码库 > java文件上传-使用apache-fileupload组件

java文件上传-使用apache-fileupload组件

 

目前文件上传的(框架)组件:Apache----fileupload 、Orialiy – COS – 2008() 、Jsp-smart-upload – 200M。

用fileupload上传文件:

需要导入第三方包:

       Apache-fileupload.jar – 文件上传核心包。

       Apache-commons-io.jar – 这个包是fileupload的依赖包。同时又是一个工具包。

使用springmvc,解决烦人的post乱码问题,新建maven项目:

技术分享

maven依赖:

<dependency>    <groupId>commons-fileupload</groupId>        <artifactId>commons-fileupload</artifactId>        <version>${commons-fileupload.version}</version></dependency><dependency>     <groupId>commons-io</groupId>     <artifactId>commons-io</artifactId>      <version>${commons-io.version}</version></dependency>
版本:

<commons-io.version>1.3.2</commons-io.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>

 

 

核心类:

       DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。

       ServletFileUpload  - 文件上传的核心类,此类接收request,并解析reqeust

  ServletFileUpload.parseRequest(request);  --List<FileItem>   解析request

       一个FileItem就是一个标识分隔符开始 到结束。如下图:

技术分享

 

查看DiskFileItemFactory源代码,可知

If not otherwise configured, the default configuration values are as follows:   Size threshold is 10KB.   Repository is the system default temp directory, as returned by   System.getProperty("java.io.tmpdir")

 可知,如果不设置临时目录,会保存在默认的临时目录-  System.getProperty("java.io.tmpdir");这个目录正是windows系统的临时文件存放目录,通过环境变量,可找到这个目录

技术分享技术分享

这里存放着许多临时文件。

 controller:

package com.lhy.upload.controller;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/** *  * DiskFileItemFactory:设置磁盘空间,保存临时文件,只是一个工具类。 * 构造器 DiskFileItemFactory(int sizeThreshold, File repository): *     sizeThreshold: *         设置缓存保存(内存)保存多少字节数据,默认10K。 *         如果一个文件没有大于10K,则直接使用内存,直接保存成文件就可以了。 *         如果一个文件大于10K,就需要将文件先保存到临时文件中去。 *     repository: *         临时目录的位置。 *  *  * ServletFileUpload:文件上传核心类,接收request 并解析。 * */@RequestMapping("/upload")@Controllerpublic class UploadController {        @RequestMapping("uploadFile")    public void uploadFile(HttpServletRequest request,HttpServletResponse response){        //获取tomcat下的up目录的路径           String path = request.getSession().getServletContext().getRealPath("/up");        //1,声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录        DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("F:/temp"));        //2,声明ServletFileUpload,接收上边的临时文件。也可以默认值        ServletFileUpload up = new ServletFileUpload(disk);        //3,解析request        try {            List<FileItem> list = up.parseRequest(request);            //如果就一个文件,            FileItem file = list.get(0);            //获取文件名:            String fileName = file.getName();            //获取文件的类型:            String fileType = file.getContentType();            //获取文件的字节码:            InputStream in = file.getInputStream();            //文件大小            int size = file.getInputStream().available();            //声明输出字节流            OutputStream out = new FileOutputStream(path+"/"+fileName);            //文件copy            byte[] b = new byte[1024];            int len = 0;            while((len=in.read(b))!=-1){                out.write(b, 0, len);            }            out.flush();            out.close();                        //删除上传生成的临时文件            file.delete();                        //显示数据            response.setContentType("text/html;charset=UTF-8");            PrintWriter pw = response.getWriter();            pw.println("文件名:"+fileName);            pw.println("文件类型:"+fileType);            pw.println("<br/>文件大小(byte):"+size);        } catch (FileUploadException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

上传文件:

技术分享

临时目录:

技术分享

服务端:

技术分享

响应:

技术分享

实际项目中都是有文件服务器的,公司一般都提供了上传到文件服务器接口,有的是上传一个file类型,有的是流。

多文件上传:和单文件一样

表单:

技术分享

controller:

/**     * 多文件上传     * @param request     * @param response     */    @RequestMapping("uploadMultipart")    public void uploadMultipart(HttpServletRequest request,HttpServletResponse response){        //获取tomcat下的up目录的路径           String path = request.getSession().getServletContext().getRealPath("/up");        //1,声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录        DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("F:/temp"));        //2,声明ServletFileUpload,接收上边的临时文件。也可以默认值        ServletFileUpload up = new ServletFileUpload(disk);        //3,解析request        try {            List<FileItem> list = up.parseRequest(request);            for (FileItem file : list) {                //获取文件名:                String fileName = file.getName();                //获取文件的类型:                String fileType = file.getContentType();                //获取文件的字节码:                InputStream in = file.getInputStream();                //使用工具类                FileUtils.writeByteArrayToFile(new File(path+"/"+fileName), file.get());                file.delete();            }        } catch (FileUploadException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

测试,上传3张图片:

技术分享

技术分享

 

java文件上传-使用apache-fileupload组件