首页 > 代码库 > 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组件