如果您对SpringBoot:使用ApacheCommonsFileUpload的大型流文件上传和springboot大文件上传解决方案感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Sprin
如果您对SpringBoot:使用Apache Commons FileUpload的大型流文件上传和springboot大文件上传解决方案感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解SpringBoot:使用Apache Commons FileUpload的大型流文件上传的各种细节,并对springboot大文件上传解决方案进行深入的分析,此外还有关于Apache Commons FileUpload 1.3.1 发布、Apache Commons FileUpload 1.3.2 发布、Apache Commons FileUpload 1.3.3 发布、Apache Commons FileUpload <1.5 存在拒绝服务漏洞的实用技巧。
本文目录一览:- SpringBoot:使用Apache Commons FileUpload的大型流文件上传(springboot大文件上传解决方案)
- Apache Commons FileUpload 1.3.1 发布
- Apache Commons FileUpload 1.3.2 发布
- Apache Commons FileUpload 1.3.3 发布
- Apache Commons FileUpload <1.5 存在拒绝服务漏洞
SpringBoot:使用Apache Commons FileUpload的大型流文件上传(springboot大文件上传解决方案)
如何解决SpringBoot:使用Apache Commons FileUpload的大型流文件上传?
感谢M.Deinum的一些非常有帮助的评论,我设法解决了这个问题。我已经整理了一些原始帖子,并将其作为完整答案发布,以备将来参考。
我犯的第一个错误是没有禁用MultipartResolverSpring
提供的默认值。这最终导致解析器处理HttpServeletRequest
并因此在我的控制器对其执行操作之前将其消耗掉。
感谢M. Deinum,禁用它的方法如下:
multipart.enabled=false
但是,此后还有另一个隐患等待着我。禁用默认的多部分解析器后,尝试进行上传时,我开始出现以下错误:
Fri Sep 25 20:23:47 IST 2015
There was an unexpected error (type=Method Not Allowed, status=405).
Request method ''POST'' not supported
在我的安全配置中,我启用了CSRF保护。这就需要我以以下方式发送POST请求:
<html>
<body>
<form method="POST" enctype="multipart/form-data" action="/upload?${_csrf.parameterName}=${_csrf.token}">
<input type="file" name="file"><br>
<input type="submit" value="Upload">
</form>
</body>
</html>
我还对控制器做了一些修改:
@Controller
public class FileUploadController {
@RequestMapping(value="/upload", method=RequestMethod.POST)
public @ResponseBody Response<String> upload(HttpServletRequest request) {
try {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
// Inform user about invalid request
Response<String> responSEObject = new Response<String>(false, "Not a multipart request.", "");
return responSEObject;
}
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (!item.isFormField()) {
String filename = item.getName();
// Process the input stream
OutputStream out = new FileOutputStream(filename);
IoUtils.copy(stream, out);
stream.close();
out.close();
}
}
} catch (FileUploadException e) {
return new Response<String>(false, "File upload error", e.toString());
} catch (IOException e) {
return new Response<String>(false, "Internal server IO error", e.toString());
}
return new Response<String>(true, "Success", "");
}
@RequestMapping(value = "/uploader", method = RequestMethod.GET)
public ModelAndView uploaderPage() {
ModelAndView model = new ModelAndView();
model.setViewName("uploader");
return model;
}
}
其中Response只是我使用的一种简单的通用响应类型:
public class Response<T> {
/** Boolean indicating if request succeeded **/
private boolean status;
/** Message indicating error if any **/
private String message;
/** Additional data that is part of this response **/
private T data;
public Response(boolean status, String message, T data) {
this.status = status;
this.message = message;
this.data = data;
}
// Setters and getters
...
}
解决方法
我正在尝试使用“流式” Apache Commons File Upload API上传大文件。
我使用Apache Commons File Uploader而不是默认的Spring Multipart Uploader的原因是,当我们上传非常大的文件大小(〜2GB)时,它失败了。我在GIS应用程序上工作,这种文件上传非常常见。
我的文件上传控制器的完整代码如下:
@Controller
public class FileUploadController {
@RequestMapping(value="/upload",method=RequestMethod.POST)
public void upload(HttpServletRequest request) {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
// Inform user about invalid request
return;
}
//String filename = request.getParameter("name");
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
try {
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.");
} else {
System.out.println("File field " + name + " with file name " + item.getName() + " detected.");
// Process the input stream
OutputStream out = new FileOutputStream("incoming.gz");
IOUtils.copy(stream,out);
stream.close();
out.close();
}
}
}catch (FileUploadException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
@RequestMapping(value = "/uploader",method = RequestMethod.GET)
public ModelAndView uploaderPage() {
ModelAndView model = new ModelAndView();
model.setViewName("uploader");
return model;
}
}
麻烦的是,getItemIterator(request)
始终返回没有任何项目(即一个迭代器iter.hasNext()
)始终返回false
。
我的application.properties文件如下:
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:19095/authdb
spring.datasource.username=georbis
spring.datasource.password=asdf123
logging.level.org.springframework.web=DEBUG
spring.jpa.hibernate.ddl-auto=update
multipart.maxFileSize: 128000MB
multipart.maxRequestSize: 128000MB
server.port=19091
的JSP视图/uploader
如下:
<html>
<body>
<form method="POST" enctype="multipart/form-data" action="/upload">
File to upload: <input type="file" name="file"><br />
Name: <input type="text" name="name"><br /> <br />
Press here to upload the file!<input type="submit" value="Upload">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
</body>
</html>
我可能做错了什么?
Apache Commons FileUpload 1.3.1 发布
Apache Commons FileUpload 1.3.1 发布,这是一个安全补丁版本,修复了编号为 CVE-2014-0050 的一个 DoS 安全漏洞。
下载地址:http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
Apache Commons FileUpload 1.3.2 发布
Apache Commons FileUpload 1.3.2 发布了。
Apache Commons FileUpload 使用最为广泛的Java文件上传组件,Struts本身采用这个包来处理文件上传。文档非常详细、简单易用。
下载地址:点击此处
详情:http://commons.apache.org/proper/commons-fileupload/
Apache Commons FileUpload 1.3.3 发布
Apache Commons FileUpload 1.3.3 已发布。
Apache Commons FileUpload 库解析符合 RFC 1867 (HTML 中基于表单的文件上传)的 HTTP 请求。也就是说,如果使用 POST 方法提交了 HTTP 请求,并且内容类型为 “multipart / form-data”,则 FileUpload 可以解析该请求,并以调用者轻松使用的方式使结果可用。
此版本唯一的更改是:
FILEUPLOAD-279:为了安全起见,DiskFileItem 不能再反序列化,除非设置了特定的系统属性。
发行说明
下载地址:
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
>>>【评论有礼】6月6日-30日评论每日更新的“新闻资讯和软件更新资讯”,评论点赞数超过 20 的可登上每周更新的“源资讯”和“软件周刊”两大栏目,点赞数超过 50 的还将获得 5 活跃积分奖励和开源中国定制好礼。详情
Apache Commons FileUpload <1.5 存在拒绝服务漏洞
漏洞描述
Apache Commons FileUpload 是一个向 servlet 和 Web 应用程序提供文件上传功能的开源组件。
1.5 之前版本中,由于 Apache Commons FileUpload 在处理用户的文件上传请求时未对文件数量进行限制,攻击者可通过上传大量文件造成拒绝服务。
1.5 版本中用户可通过配置 FileUploadBase#setFileCountMax 限制用户文件上传数量(默认不启用,需手动配置)。
漏洞名称 | Apache Commons FileUpload <1.5 存在拒绝服务漏洞 |
---|---|
漏洞类型 | 不加限制或调节的资源分配 |
发现时间 | 2023-02-21 |
漏洞影响广度 | 小 |
MPS编号 | MPS-2023-3553 |
CVE编号 | CVE-2023-24998 |
CNVD编号 | - |
影响范围
commons-fileupload:commons-fileupload@[1.0-beta-1, 1.5)
修复方案
将组件 commons-fileupload:commons-fileupload 升级至 1.5 及以上版本
参考链接
https://www.oscs1024.com/hd/MPS-2023-3553
https://nvd.nist.gov/vuln/detail/CVE-2023-24998
https://github.com/apache/commons-fileupload/commit/e20c04990f7420ca917e96a84cec58b13a1b3d17
https://commons.apache.org/proper/commons-fileupload/security-reports.html
免费情报订阅&代码安全检测
OSCS是国内首个开源软件供应链安全社区,社区联合开发者帮助全球顶级开源项目解决安全问题,并提供实时的安全漏洞情报,同时提供专业的代码安全检测工具为开发者免费使用。社区开发者可以通过配置飞书、钉钉、企业微信机器人获取一手的情报。
免费代码安全检测工具: https://www.murphysec.com/?src=osc
免费情报订阅: https://www.oscs1024.com/cm/?src=osc
具体订阅方式详见: https://www.oscs1024.com/docs/vuln-warning/intro/?src=osc
今天的关于SpringBoot:使用Apache Commons FileUpload的大型流文件上传和springboot大文件上传解决方案的分享已经结束,谢谢您的关注,如果想了解更多关于Apache Commons FileUpload 1.3.1 发布、Apache Commons FileUpload 1.3.2 发布、Apache Commons FileUpload 1.3.3 发布、Apache Commons FileUpload <1.5 存在拒绝服务漏洞的相关知识,请在本站进行查询。
本文标签: