Servlet 3.0之Part对象(文件上传)

之前使用Java处理文件上传需要引用各种库,但在servlet3.0之后java提供了文件上传对象,使用更加简单。
这里提供一个Servlet版本对照:

servlet版本

文件上传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 可以设置 相应参数限制条件,必须声明,否则会报错

参数类型概述
locationString指定上传文件的临时目录,默认为"",绝对路径
fileSizeThresholdint指定缓存大小,超过会先存入临时目录,默认0
maxFileSizelong单个上传文件最大大小,默认是-1,表示没有限制,单位:bytes
maxRequestSizelong限制该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();
	}
}

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

  • 20
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是的,Servlet 3.0 版本及其之后的版本增加了对文件上传的支持,并提供了相关的注解来简化文件上传的处理。 在 Servlet 3.0+ 版本中,可以使用 `@MultipartConfig` 注解来标记一个 Servlet 或者一个 Servlet 类,表示该 Servlet 可以接收包含文件上传的请求。这个注解可以用在 Servlet 类或者 `web.xml` 的 `<servlet>` 元素上。 使用 `@MultipartConfig` 注解时,可以指定一些属性,如 `location`、`maxFileSize`、`maxRequestSize` 等,来控制文件上传的相关配置。 下面是一个使用 `@MultipartConfig` 注解的示例: ```java @WebServlet(name = "UploadServlet", urlPatterns = {"/upload"}) @MultipartConfig( fileSizeThreshold = 1024 * 1024, // 1MB maxFileSize = 1024 * 1024 * 5, // 5MB maxRequestSize = 1024 * 1024 * 10 // 10MB ) public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理文件上传逻辑 Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); InputStream fileContent = filePart.getInputStream(); // ... } } ``` 在上面的示例中,`@MultipartConfig` 注解指定了文件上传的一些配置,例如文件大小阈值、最大文件大小和最大请求大小。在 `doPost()` 方法中,使用 `request.getPart()` 方法获取上传的文件部分,然后可以通过 `Part` 对象获取文件名、输入流等信息进行处理。 通过这种方式,Servlet 3.0+ 版本的文件上传变得更加简单和方便。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值