Java 使用FileCopyUtils.copy在spring中上载大文件
我正在使用org.springframework.util.FileCopyUtils来上传项目中的文件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
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。或者,您也可以使用小程序或客户端中的某些内容对文件进行分块。