要上传文件,需要用post方法,并且设置enctype为multipart/form-data。

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="text" name="param1">
  <input type="text" name="param2">
  <input type="file" name="fileparam">
  <button type="submit">上传</button>
</form>

关于multipart/form-data

multipart/form-data与post方法结合,用了multipart/form-data的post请求与普通的post请求的请求头和请求体都有不同。

普通post请求头中Content-Type字段值为:

Content-Type: application/x-www-form-urlencoded

multipart/form-data请求头中Content-Type字段值为multipart/form-data; boundary=xxxxxxx, (xxxxxx规定了请求体中的内容分隔符)。

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZpsWTsOiRHI0TBW7

普通post请求的请求体格式为(不会上传文件内容):

param1=AAAA&param2=&fileparam=test.txt

而multipart/form-data请求体格式为(包含文件内容):

------WebKitFormBoundaryjUVXJ3PslTEBh9as
Content-Disposition: form-data; name="param1" AAAA
------WebKitFormBoundaryjUVXJ3PslTEBh9as
Content-Disposition: form-data; name="param2" ------WebKitFormBoundaryjUVXJ3PslTEBh9as
Content-Disposition: form-data; name="fileparam"; filename="test.txt"
Content-Type: text/plain contents of file
------WebKitFormBoundaryjUVXJ3PslTEBh9as

后台处理

使用multipart/form-data提交的数据使用HttpServletRequest对象的getParameter()等方法无法读取。可以读取整个请求体数据流自己解析数据。但更好的方式是使用已经有的第三方工具类,如fileupload,jspsmartupload。下面的例子中使用的是fileupload。

HttpServletRequeest request=....
if(ServletFileUpload.isMultipartContent(request))
{
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
for(FileItem i: items)
{
i.getFieldName();   //参数名
//i.getString();   //参数值(返回字符串),如果是上传文件,则为文件内容
     //i.get();   //参数值(返回字节数组),如果是上传文件,则为文件内容
     //i.getSize();     //参数值的字节大小
     //i.getName();     //上传文件的文件名
     //i.getContentType(); //上传文件的内容类型
     if(!i.isFormField()&&i.getSize()>0)   //简单参数返回true,文件返回false
      Files.write(Paths.get("/upload/"+Paths.get(i.getName()).getFileName()), i.get());
  }
}

最新文章

  1. js switch 扩展
  2. svn:ignore eclipse开发一般忽略文件
  3. Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property &#39;xxx&#39;: no matching editors or conversion strategy found
  4. pom中定义某jar包的依赖,但并不使用该jar包,那最后部署的应用中会有这个jar包么?
  5. Eclipse中修改Web项目的URL访问路径
  6. vmware vcenter orchestrator configuration提示“用户名密码错误或登录失败超过次数被锁定”
  7. intellij自动缩进排版
  8. python中的remove趣谈
  9. Qt 富文本处理(QTextDocument和QTextBlock和QTextFrame和QTextTable和QTextList和QTextDocument)
  10. Ch06 验证
  11. Swing之JTable的详细介绍(转)
  12. Openlayers实现第一张地图
  13. Mac入门推荐(写给Mac小白)
  14. crypto必知必会
  15. 如何查找元素对应事件的js代码,检测定位js事件
  16. 数据库session立即生效(64---8192) SCOPE参数
  17. [Ting&#39;s笔记Day6]活用套件carrierwave gem:(1)在Rails实现图片上传功能
  18. pip --version问题
  19. jQuery中bind,live,delegate,on的区别
  20. C# 默认参数/可选参数需要注意

热门文章

  1. Android 判断app是否在前台运行
  2. Android之XML序列化和解析
  3. Linux内核同步机制之(二):Per-CPU变量
  4. repo sync下载脚本
  5. Entity Framework 使用
  6. 设计模式学习之原型模式(Prototype,创建型模式)(5)
  7. tnsnames.ora存放路径
  8. 向hive上传数据时,中文乱码
  9. Python实践:开篇
  10. bzoj1032 [JSOI2007]祖码Zuma