标签:public 获取 post enc group http 内存 jsp ima
需要导入第三方包:
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系统的临时文件存放目录,通过环境变量,可找到这个目录
这里存放着许多临时文件。
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") @Controller public 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组件
标签:public 获取 post enc group http 内存 jsp ima
原文地址:http://www.cnblogs.com/lihaoyang/p/7295434.html