Servlet 3.0之Part对象(文件上传)
之前使用Java处理文件上传需要引用各种库,但在servlet3.0之后java提供了文件上传对象,使用更加简单。
这里提供一个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 可以设置 相应参数限制条件,必须声明,否则会报错
参数 | 类型 | 概述 |
---|---|---|
location | String | 指定上传文件的临时目录,默认为"",绝对路径 |
fileSizeThreshold | int | 指定缓存大小,超过会先存入临时目录,默认0 |
maxFileSize | long | 单个上传文件最大大小,默认是-1,表示没有限制,单位:bytes |
maxRequestSize | long | 限制该multipart/form-data请求中数据的大小,默认是-1,表示没有限制,单位:bytes |
FileSize表示上传的单个文件的大小,RequestSize表示一次上传的总的数据量,所以可以在一个表单中一次上传多个文件。
普通表单上传
- enctype 需使用 multipart/form-data类型
- method 需要使用 post 方法提交
- 需要使用 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-TypedataType:"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();}
}
在后台代码做一点改进,文件目录可能在本地测试和服务器有差别,需要动态获取,文件名也需要动态获取,以便增加代码可用性
Servlet 3.0之Part对象(文件上传)相关推荐
- Asp.net MVC 1.0 RTM中实现文件上传
Asp.net MVC 1.0 RTM中实现文件上传 在我们开始之前,你需要知道一个form以post方式上传文件的方式,你将要增加一个特别的enctype attribute到form标签上,为了这 ...
- servlet part对象文件上传
1. part上传 如果文件上传不成功.需要显示定义文件存储位置: @MultipartConfig(location = "E:/text") 文件上传核心代码: String ...
- Asp.net2.0下的大文件上传服务器控件
最近本来准备在Alisoft上做点东西玩,做的过程中,涉及到了文件上传.刚开始,准备在网上找几个用,发现国外好用的要钱,而国内的,开源的又不好用,所以决定自己也写一个,顺便以后赚点外快.我看了一下,这 ...
- 如何使用Servlet,JSP和MySQL将文件上传到数据库
本教程显示了如何实现Java Web应用程序(使用Servlet和JSP),该Java Web应用程序将文件上传到服务器并将文件保存到数据库. 该应用程序采用以下技术: Servlet 3.0+:从S ...
- ThinkPHP5.0+七牛云SDK文件上传
一.问:为什么建议大家使用对象存储 对象存储可以简单理解为用来存储图片.音频.视频等非结构化数据的数据池.相对于主机服务器,具有读写速度快,利于分享的特点.我为什么建议大家使用对象存储?我总结了这六点 ...
- Servlet3.0 多图片,文件上传
1.分析 上传文件的过程:客服端选择一个文件后,写入到服务器端,服务器端使用一个目录来存储该文件--底层IO流操作 2.jsp文件上的表单设计 表单传输格式用multipart/form-data,要 ...
- servlet实现文件上传,预览,下载和删除
一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...
- 通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)
1.最终效果 实现选择图片(此处以图片为例,支持所有类型文件的上传),选择之后将选择的图片在页面中显示出来,点击上传,可以将文件上传到指定的地址中,上传成功后在当前页面自动显示下载标签. 源码下载地址 ...
- WeiPHP5.0 前台任意文件上传漏洞
本博客已搬迁至:https://n0puple.github.io/ 此处不再更新文章 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景.如因涉嫌违法造成的一切不良影响,本文作者概不负责 ...
最新文章
- 经典算法详解(8)数的分组
- DAY02 WINDOWS Ghost系统的备份与还原以及不同虚拟机的通信的实现
- 一个Java应届生从上海离职,附项目源码
- struts.xml配置文件结构
- 数据结构(python语言)目录链接
- saltstack批量加用户脚本
- 我的第一个web开发框架
- SSL 1760——商店选址问题(最短路)
- AngularJS 日期格式化
- 李洋疯狂C语言之break和continue的区别
- Poj2259 Team Queue 【队列】
- python外包凹多边形生成_用Opencv python裁剪图像中的凹多边形
- php匹配正则的方法,PHP实现正则匹配操作的方法
- 修复XP图片和传真查看器!
- 苹果/安卓兼容性页面显示问题
- APP合集,简单总结一下
- 无机物及有机物储氢材料/MNi4.8Sn0.2(M=La,Nd)合金粒子负载纳米碳管复合储氢材料/LaNi4.8Sn0.2/CNTs纳米碳管复合储氢材料
- 项目文件夹下的obj文件夹
- 西游记中会七十二变的三个人
- 计算机音乐谱安娜的橱窗,《安娜的橱窗,钢琴谱》2,封茗囧菌(五线谱 钢琴曲 指法)-弹吧|蛐蛐钢琴网...