之前使用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. “私有云”安全的“过渡”时期-“云朵”方案的设计思路
  2. Docker知识2:安装docker-desktop
  3. [机器学习]回归--Decision Tree Regression
  4. 64岁Python之父加入微软 | 谁说大龄程序员无出路
  5. Spring Boot 终极清单
  6. WordPress主题-Qinmei视频主题3.0版本
  7. kafka(一)—基本概念
  8. 【Qt教程】1.11 - Qt5 标准对话框QMessageBox(关于、错误、信息、警告、问题、颜色、字体、文件对话框)
  9. 个人第三次软件工程作业-效能分析
  10. java目录删除_java删除文件及目录
  11. 标签打印软件如何制作DataMatrix二维码
  12. android面试题整理(上)
  13. EXCEL地理工具--小O地图EXCEL插件0705版 2022.4.28发布
  14. 使用Python办公自动化:将文本、表格及图片写入到Word
  15. android studio真机调试华为手机
  16. 机器学习之离散值处理
  17. CSS-transform 平面/空间(移动、旋转、缩放、过渡)略解以及示例
  18. guns框架分页实现
  19. Java学习日记(71-80天,BP 神经网络)
  20. 一、Flash Player的版本

热门文章

  1. 自动化签到的三种方式
  2. sin函数对照表_三角函数值对照表
  3. 以前的java单机游戏过关长剑,玩过这些经典单机游戏_就说明你已经老了
  4. GPS经纬度转化为百度地图/Google坐标及互转方案
  5. 【C++·峰顶计划】引用操作及底层原理深析
  6. 需求文档撰写——心得
  7. 旋转木马 css,CSS:3D旋转木马效果
  8. 香港服务器 微信支付,如何给微信开通香港钱包(WeChat Pay HK)
  9. c语言非布拉数前20个,C语言数据类型转换
  10. FMS Dev Guide学习笔记(验证客户端)