文件上传API

HttpServletRequest 提供了两个方法用于从请求中解析上传的文件:

Part getPart(String name): 用于获取请求中指定name的文件
Coolection< Part > getParts();获取请求中全部的文件

每一个文件用 javax.servlet.http.Part 对象来表示,该接口提供了很多处理文件的方法
Part API

方法 描述 返回值
write(String fileName) 将文件内容写入指定的磁盘位置 void
getSize() 获取上传文件的大小 long
getName() 获取file控件的name属性 String
getHeader(String name) 获取指定请求头 String
getHeaderNames() 获取所有请求头的名称 String
getHeaders(String name) 获取指定header名称的集合数据 Collection< String >
getContentType() 获取文件MIME类型 String
getInputStream() 获取输入流用于检索文件的内容 InputStream
delete() 删除Part数据和临时目录数据,默认会删除 void
getSubmittedFileName() 获取上传文件名Servlet3.1 Tomcat8.0实现 String

结合 HttpServletRequest 对象和@MultipartConfig 注解来处理文件上传.
指定缓存大小和临时目录
@MutipartConfig 可以设置 相应参数限制条件,必须声明,否则会报错

参数 类型 概述
location String 指定上传文件的临时目录,默认为"",绝对路径
fileSizeThreshold int 指定缓存大小,超过会先存入临时目录,默认0
maxFileSize long 单个上传文件最大大小,默认是-1,表示没有限制,单位:bytes
maxRequestSize long 限制该multipart/form-data请求中数据的大小,默认是-1,表示没有限制,单位:bytes

FileSize表示上传的单个文件的大小,RequestSize表示一次上传的总的数据量,所以可以在一个表单中一次上传多个文件。

普通表单上传

  1. enctype 需使用 multipart/form-data类型
  2. method 需要使用 post 方法提交
  3. 需要使用 file 控件

html页面

    <form action="servlet/TestFileUpLoad" enctype="multipart/form-data" method="post">
    	<input type="file" accept="" id="upfile" name="upfile">
    	<input type="submit" value="提交">
    </form>

servlet页面

@MultipartConfig(location="D:/", fileSizeThreshold=1024*102,maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
public class TestFileUpLoad extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		JSONObject jsonReply =new JSONObject();
		try {
			String fileName=UUID.randomUUID().toString()+".jpg";//名字避免重复使用uuid+后缀
			Part part=request.getPart("upfile");
			part.write(fileName);
			String fileRealName=part.getSubmittedFileName();
			jsonReply.put("fileName", fileRealName);
			jsonReply.put("success", "ok");
		} catch (Exception e) {
			e.printStackTrace();
			jsonReply.put("error", "error");
		response.setContentType("text/plain");
		response.setCharacterEncoding("utf-8");
		PrintWriter out=response.getWriter();
		out.write(jsonReply.toString());
		out.close();

Ajax表单上传

使用jquery的ajax方法实现异步上传

html页面

    <input type="file" accept="" id="upfile" name="upfile">
    <input type="button" value="提交" onclick="upFile()">
    <script type="text/javascript">
    	function upFile(){
    		var upfile=$("#upfile")[0].files[0];
    	    var myForm = new FormData();//必须使用FormData表达上传数据
            myForm.append("upfile",upfile);
            $.ajax({
		    	method:"post",
		    	url:"servlet/TestFileUpLoad",
		    	data:myForm,
		    	processData: false,//禁止类型转换//必须false才会避开jQuery对 formdata 的默认处理
        		contentType: false,//必须false才会自动加上正确的Content-Type
        		dataType:"json",
		    	success:function(data){
		    		console.log(data);
		    	error:function(err){
		    		console.log("error:"+err);
    </script>

servlet页面

@MultipartConfig(maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)
public class TestFileUpLoad extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		JSONObject jsonReply =new JSONObject();
		try {
			Part part=request.getPart("upfile");
			//获取文件后缀名,即文件类型
			String realFileName=part.getSubmittedFileName();
			String type=realFileName.substring(realFileName.lastIndexOf("."));			
			String fileName=UUID.randomUUID().toString()+type;
			//获取项目下的该文件夹路径,必须先创建文件夹
			String path=getServletContext().getRealPath("/file/")+fileName;
			part.write(path);
			jsonReply.put("fileType", type);
			jsonReply.put("success", "ok");
		} catch (Exception e) {
			e.printStackTrace();
			jsonReply.put("error", "error");
		response.setContentType("text/plain");
		response.setCharacterEncoding("utf-8");
		PrintWriter out=response.getWriter();
		out.write(jsonReply.toString());
		out.close();
 

在后台代码做一点改进,文件目录可能在本地测试和服务器有差别,需要动态获取,文件名也需要动态获取,以便增加代码可用性

之前使用Java处理文件上传需要引用各种库,但在servlet3.0之后java提供了文件上传对象,使用更加简单。这里提供一个Servlet版本对照:文件上传APIHttpServletRequest 提供了两个方法用于从请求中解析上传的文件:Part getPart(String name): 用于获取请求中指定name的文件Coolection&lt; Part &gt; getP... 二:文件上传的表单提交方式必须是POST方式, 编码类型:enctype=”multipart/form-data”,默认是 application/x-www-form-urlencoded <form action="FileUpLoad"enctype="multipart/form-dat import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax...
本文档介绍了文件上传的处理方法,包括当前端form表单的编码类型为enctype="multipart/form-data"时如何处理?以及老办法获取上传文件的名字,新办法自己一个函数获取上传文件的名字。最后讲解了上传一个文件和上传多个文件的区别和代码。 一、文件上传注意事项 当前端的form表单包含有文件上传时,有以下知识点: 1.form表单中的数据编码类型要写enctype="multipart/form-data" 才能上传文件,该编码类型将会以二进制的形式上传数据。 2.问题来了,..
Servlet 3.0 改进了部分API,这种改进很好地简化了Java Web开发。其中包括HttpServletRequest 增加了对文件上传的支持。 HttpServletRequest 提供了如下两个方法来处理文件上传: Part getPart(String name); 根据 name 来获取文件上传域 Collection getParts(); 获取所有的文件上传域 构造上传文件的表单 <form action="uploadServlet" method="post" encty
1、在上传文件前请在计算机C盘新建一个名为“upload”的文件夹,否则会出现如下异常:java.io.IOException: The temporary upload location [C:\upload] is not valid 2、请不要使用360安全浏览器演示本功能,否则会出现如下异常:java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
Java开发技术大全.part1.rar 免积分下载(解压需5个文件part1,part2,part3,part4,part5,目前一次只能上传70M,不得不分卷,希望大家谅解下) 《Java 面向对象编程》[1] 内容由浅入深,紧密结合实际,利用大量典型实例,详细讲解Java面向对象的编程思想、编程语法和设计模式,介绍常见Java类库的用法,总结Java编程的各种经验,深入阐述Java虚拟机执行程序的原理。书中实例均基于最新的JDK 1.5版本。全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机执行Java程序的原理、在实际项目中的运用、设计模式和性能优化技巧。
  @RequestPart用于将multipart/form-data类型数据映射到控制器处理方法的参数中。除了@RequestPart注解外,@RequestParam同样可以用于此类操作。   ① value:     绑定的参数名称,参数值为String类型。   ② name:     绑定的参数名称,参数值为String类型。name和value可以同时使用,但两者的值需一致,否则会出现错误。 attribute 'name' and its alias 'value' are p
servlet的八大域对象分别是:ServletContext、ServletRequest、ServletResponse、HttpSession、PageContext、ServletConfig、ServletContextAttributeEvent和ServletRequestAttributeEvent。这些对象可以在servlet程序的不同作用域内共享数据和信息,方便程序开发和管理。其中,ServletContext代表整个Web应用程序的上下文环境,可以获取Web应用程序的初始化参数和资源路径;ServletRequest代表客户端的HTTP请求,包含请求的头信息和请求参数等;ServletResponse代表服务器响应客户端请求的对象,包含响应头信息和响应数据等;HttpSession代表客户端和服务器之间的会话,可以保存和管理用户的状态信息;PageContext代表JSP页面的上下文环境,包含页面的请求、响应和其他属性;ServletConfig代表servlet的配置信息,可以获取servlet的初始化参数和上下文环境;ServletContextAttributeEvent代表ServletContext属性的变化事件;ServletRequestAttributeEvent代表ServletRequest属性的变化事件。