multipart/form-data请求与文件上传
要上传文件,需要用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¶m2=&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());
}
}
multipart/form-data请求与文件上传的更多相关文章
- Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)
Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie) 一.HttpRequest对象 #HttpRequest ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- WordPress Contact Form 7插件任意文件上传漏洞
漏洞名称: WordPress Contact Form 7插件任意文件上传漏洞 CNNVD编号: CNNVD-201311-415 发布时间: 2013-11-28 更新时间: 2013-11-28 ...
- el-upload用form的方式多文件上传的方法
使用el-upload组件遇到的坑. 1.第一种感觉最好,首先多个文件是一个http请求,另外还可以传除文件外其他的参数,但是没有进度条了. 发送请求的部分没有注释的部分是我分装了调后台的api,注释 ...
- 前端笔记之微信小程序(三)GET请求案例&文件上传和相册API&配置https
一.信息流小程序-GET请求案例 1.1服务端接口开发 一定要养成接口的意识,前端单打独斗出不来任何效果,必须有接口配合,写一个带有分页.关键词查询的接口: 分页接口:http://127.0.0.1 ...
- 测试平台系列(92) 让http请求支持文件上传
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; import java.io.Un ...
- Laravel请求/Cookies/文件上传
一.HTTP请求 1.基本示例:通过依赖注入获取当前 HTTP 请求实例,应该在控制器的构造函数或方法中对Illuminate\Http\Request 类进行类型提示,当前请求实例会被服务容器自动注 ...
- form+iframe实现ajax文件上传
在做文件上传时除了传入文件外,还有附件参数,并且要求不刷新页面,之前是表单提交的方式,现在修改成ajax上传的方式,由于没有选择用插件,所以用form+iframe的方式,并且这种方式对IE8以上及主 ...
- form表单多文件上传
1.html/jsp主页 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
随机推荐
- [Android Pro] RecyclerView实现瀑布流效果(二)
referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...
- [Linux] Linux进程PID散列表
linux系统中每个进程由一个进程id标识,在内核中对应一个task_struct结构的进程描述符,系统中所有进程的task_struct通过链表链接在一起,在内核中,经常需要通过进程id来获取进程描 ...
- 一箭双雕打开Genesis
打开记事本,将如下内容填入,保存时将后缀名改为bat @ ECHO 正在清理垃圾文件...del C:\tmp\*.* /f /q@ ECHO 清理完毕@ ECHO OFF@ ECHO.@ ECHO. ...
- Redis笔记(一)Redis简介
关于Redis Redis是一款开源的高性能键值对数据库,最初的作者是意大利的Salvatore Sanfilippo,他的github是 antirez ,Redis的源码同样托管在Git上:htt ...
- C++的那些事:流与IO类
1.流的概念 "流"就是"流动",是物质从一处向另一处流动的过程,比如我们能感知到的水流.C++的流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存) ...
- K-集合 (JXNU第二次周赛1006)set/平衡树
K-集合 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submissi ...
- hdu 4640(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...
- 常用的Linux操作
1.运行.sh文件 第一种方法: 首先你要打开一个终端. 然后输入sudo su 随后输入密码.这样就取得了root用户权限. 然后找到那个文件 执行./sh文件名字 这样.sh就运行了. 第二种方法 ...
- 建模算法(十一)——目标规划
求解多目标规划的思路 1.加权系数法 为每一个目标加一个权系数,把多目标模型转化成单一目标模型.但是困难时确定合理的权系数,以反映不同目标之间的重要程度. 2.优先等级法 将各目标按其重要程度分为不同 ...
- pagefile.sys and heberfil.sys
dub 删除heberfil.sys大文件的方法 方法1:Windows/system32中的cmd.exe 输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil.sys ...