Java 使用FileCopyUtils.copy在spring中上载大文件

Java 使用FileCopyUtils.copy在spring中上载大文件,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在使用org.springframework.util.FileCopyUtils来上传项目中的文件 FileCopyUtils.copy(multipartFile.getBytes(), new FileOutputStream( basePath + "/" + uploadedfile.getFileName())); 它使用FileOutputStream上载文件,对于较小的文件,这很好,但如何上载2GB或更大的文件?这可能会有帮助: 我们首先要检查的是- multipartRe

我正在使用org.springframework.util.FileCopyUtils来上传项目中的文件

FileCopyUtils.copy(multipartFile.getBytes(), new FileOutputStream( basePath + "/" + uploadedfile.getFileName()));
它使用FileOutputStream上载文件,对于较小的文件,这很好,但如何上载2GB或更大的文件?

这可能会有帮助:

我们首先要检查的是-

multipartResolver maxUploadSize:单个请求的最大上载大小。这意味着所有上载文件的总大小不能超过此配置的最大值。默认值为无限制(值为-1)

我们要检查的第二件事是-

您正在使用哪台服务器运行应用程序

如果是tomcat那么, 您必须在其中进行一些配置

参考:

maxPostSize

将由容器表单URL参数解析处理的帖子的最大大小(以字节为单位)。通过将此属性设置为小于或等于0的值,可以禁用该限制。如果未指定,此属性将设置为2097152(2 MB)

另一个限制是:

maxHttpHeaderSize请求和响应HTTP标头的最大大小,以字节为单位指定。如果未指定,则此属性设置为4096(4 KB)

你可以在里面找到它们

$TOMCAT_HOME/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           maxPostSize="4294967296"
           redirectPort="8443" />

这会将最大文件上载大小设置为4GB。

这可能会有帮助:

我们首先要检查的是-

multipartResolver maxUploadSize:单个请求的最大上载大小。这意味着所有上载文件的总大小不能超过此配置的最大值。默认值为无限制(值为-1)

我们要检查的第二件事是-

您正在使用哪台服务器运行应用程序

如果是tomcat那么, 您必须在其中进行一些配置

参考:

maxPostSize

将由容器表单URL参数解析处理的帖子的最大大小(以字节为单位)。通过将此属性设置为小于或等于0的值,可以禁用该限制。如果未指定,此属性将设置为2097152(2 MB)

另一个限制是:

maxHttpHeaderSize请求和响应HTTP标头的最大大小,以字节为单位指定。如果未指定,则此属性设置为4096(4 KB)

你可以在里面找到它们

$TOMCAT_HOME/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           maxPostSize="4294967296"
           redirectPort="8443" />


这将最大文件上传大小设置为4GB。

根据@m-deinum的评论,我最终使用
org.springframework.util.StreamUtils
上传大文件:

StreamUtils.copy(multipartFile.getInputStream(), new FileOutputStream( basePath + "/" + uploadedfile.getFileName()));
我使用输入流而不是字节[]上传文件,也使用输入流读取(下载)文件:

try {
        inputStream = new FileInputStream(basePath + "/" + fileName);
        byte[] buffer = new byte[4096];
        int bytesRead = 0;
        do {
            bytesRead = inputStream.read(buffer, 0, buffer.length);
            httpServletResponse.getOutputStream().write(buffer, 0, bytesRead);
        } while (bytesRead == buffer.length);

        /* some code for set attributes to httpServletResponse */
    } finally {
        if (inputStream != null)
            inputStream.close();
    }

根据@m-deinum的评论,我最终使用
org.springframework.util.StreamUtils
上传大文件:

StreamUtils.copy(multipartFile.getInputStream(), new FileOutputStream( basePath + "/" + uploadedfile.getFileName()));
我使用输入流而不是字节[]上传文件,也使用输入流读取(下载)文件:

try {
        inputStream = new FileInputStream(basePath + "/" + fileName);
        byte[] buffer = new byte[4096];
        int bytesRead = 0;
        do {
            bytesRead = inputStream.read(buffer, 0, buffer.length);
            httpServletResponse.getOutputStream().write(buffer, 0, bytesRead);
        } while (bytesRead == buffer.length);

        /* some code for set attributes to httpServletResponse */
    } finally {
        if (inputStream != null)
            inputStream.close();
    }

在为多部分文件定义bean时,您是否尝试过设置属性“maxUploadSize”?@zombie是的,我在mvc-dispatcher-servlet.xml文件中将多部分解析器bean的“maxUploadSize”属性设置为1000000000(以字节为单位)。对于这样的大文件,这样做并不明智。使用
StreamUtils
并使用输入流而不是阻止将整个内容加载到内存中的
byte[]
。@m-deinum我使用
StreamUtils.copy(multipartFile.getInputStream(),new FileOutputStream(basePath+“/”+uploadedfile.getFileName())但创建4GB大小的目标上载文件需要太长时间。在为多部分文件定义bean时,是否尝试设置属性“maxUploadSize”?@zombie是的,我将多部分解析器bean的“maxUploadSize”属性设置为1000000000(字节)在mvc-dispatcher-servlet.xml文件中。对于这样的大文件,很好地这样做并不明智。使用
StreamUtils
并使用输入流而不是阻止将整个内容加载到内存中的
byte[]
。@m-deinum我使用
StreamUtils.copy(multipartFile.getInputStream(),new FileOutputStream(basePath+“/”+uploadedfile.getFileName())但是创建4GB大小的目标上传文件需要太长时间。谢谢你的回答,我在tomcat的server.xml中更改了maxPostSize,但是问题仍然存在;每一个上传的文件大小,目标上传的文件大小都不会超过15MB。我认为http post允许的文件非常有限。或者对于较大的文件传输,您应该使用ftp。或者你可以在客户端使用applet或其他东西来分块文件;每一个上传的文件大小,目标上传的文件大小都不会超过15MB。我认为http post允许的文件非常有限。或者对于较大的文件传输,您应该使用ftp。或者,您也可以使用小程序或客户端中的某些内容对文件进行分块。