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=123456&fileparam=test.txt
而multipart/form-data请求体格式为(包含文件内容):
------WebKitFormBoundaryjUVXJ3PslTEBh9as Content-Disposition: form-data; name="param1" AAAA ------WebKitFormBoundaryjUVXJ3PslTEBh9as Content-Disposition: form-data; name="param2" 123456 ------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()); }
}
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构