GVKun编程网logo

SpringBoot:使用Apache Commons FileUpload的大型流文件上传(springboot大文件上传解决方案)

13

如果您对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大文件上传解决方案)

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 发布

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 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 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 <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 存在拒绝服务漏洞的相关知识,请在本站进行查询。

本文标签: