之前使用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表示一次上传的总的数据量,所以可以在一个表单中一次上传多个文件。

普通表单上传

  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-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对象(文件上传)相关推荐

  1. Asp.net MVC 1.0 RTM中实现文件上传

    Asp.net MVC 1.0 RTM中实现文件上传 在我们开始之前,你需要知道一个form以post方式上传文件的方式,你将要增加一个特别的enctype attribute到form标签上,为了这 ...

  2. servlet part对象文件上传

    1. part上传 如果文件上传不成功.需要显示定义文件存储位置: @MultipartConfig(location = "E:/text") 文件上传核心代码: String ...

  3. Asp.net2.0下的大文件上传服务器控件

    最近本来准备在Alisoft上做点东西玩,做的过程中,涉及到了文件上传.刚开始,准备在网上找几个用,发现国外好用的要钱,而国内的,开源的又不好用,所以决定自己也写一个,顺便以后赚点外快.我看了一下,这 ...

  4. 如何使用Servlet,JSP和MySQL将文件上传到数据库

    本教程显示了如何实现Java Web应用程序(使用Servlet和JSP),该Java Web应用程序将文件上传到服务器并将文件保存到数据库. 该应用程序采用以下技术: Servlet 3.0+:从S ...

  5. ThinkPHP5.0+七牛云SDK文件上传

    一.问:为什么建议大家使用对象存储 对象存储可以简单理解为用来存储图片.音频.视频等非结构化数据的数据池.相对于主机服务器,具有读写速度快,利于分享的特点.我为什么建议大家使用对象存储?我总结了这六点 ...

  6. Servlet3.0 多图片,文件上传

    1.分析 上传文件的过程:客服端选择一个文件后,写入到服务器端,服务器端使用一个目录来存储该文件--底层IO流操作 2.jsp文件上的表单设计 表单传输格式用multipart/form-data,要 ...

  7. servlet实现文件上传,预览,下载和删除

    一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转 ...

  8. 通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)

    1.最终效果 实现选择图片(此处以图片为例,支持所有类型文件的上传),选择之后将选择的图片在页面中显示出来,点击上传,可以将文件上传到指定的地址中,上传成功后在当前页面自动显示下载标签. 源码下载地址 ...

  9. WeiPHP5.0 前台任意文件上传漏洞

    本博客已搬迁至:https://n0puple.github.io/ 此处不再更新文章 本文仅用于技术讨论与研究,文中的实现方法切勿应用在任何违法场景.如因涉嫌违法造成的一切不良影响,本文作者概不负责 ...

最新文章

  1. 经典算法详解(8)数的分组
  2. DAY02 WINDOWS Ghost系统的备份与还原以及不同虚拟机的通信的实现
  3. 一个Java应届生从上海离职,附项目源码
  4. struts.xml配置文件结构
  5. 数据结构(python语言)目录链接
  6. saltstack批量加用户脚本
  7. 我的第一个web开发框架
  8. SSL 1760——商店选址问题(最短路)
  9. AngularJS 日期格式化
  10. 李洋疯狂C语言之break和continue的区别
  11. Poj2259 Team Queue 【队列】
  12. python外包凹多边形生成_用Opencv python裁剪图像中的凹多边形
  13. php匹配正则的方法,PHP实现正则匹配操作的方法
  14. 修复XP图片和传真查看器!
  15. 苹果/安卓兼容性页面显示问题
  16. APP合集,简单总结一下
  17. 无机物及有机物储氢材料/MNi4.8Sn0.2(M=La,Nd)合金粒子负载纳米碳管复合储氢材料/LaNi4.8Sn0.2/CNTs纳米碳管复合储氢材料
  18. 项目文件夹下的obj文件夹
  19. 西游记中会七十二变的三个人
  20. 计算机音乐谱安娜的橱窗,《安娜的橱窗,钢琴谱》2,封茗囧菌(五线谱 钢琴曲 指法)-弹吧|蛐蛐钢琴网...

热门文章

  1. 巴特沃斯、切比雪夫Ⅰ型、切比雪夫Ⅱ型和椭圆型滤波器的相同和不同之处
  2. 【patch】CNN中 patch 是什么?patch 在CNN学习训练中是怎么起作用的?
  3. celery爬取58同城二手车数据及若干问题
  4. mac如何开两个qq?
  5. java 获取当年法定假日以及公休日-接口坞
  6. python画出一个小房子简单代码
  7. SSD 1306显示屏 adafruit SSD 1306
  8. 《数据库》数据库的备份与恢复
  9. 四十六、基础框架(四)字符串物件
  10. UE4-4.26蓝图功能实现:按键升降电梯