当我尝试上传大于2GB的文件时,java.io.ByteArrayOutputStream正在提供OutOfMemoryError。
我检查了这个类,发现以下代码导致了这个问题。
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
MAX_ARRAY_SIZE定义为:private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
有没有办法克服这个问题,并使用这个类上传任何大小的文件?或者是否有其他方式上传文件。
答案 0 :(得分:0)
有没有办法克服这个问题并使用这个类上传任何大小的文件?
没有。没有。
您正在将文件上传到内存中,并且无法将无限大文件加载到内存中。记忆是有限的。
(是的,你可以得到一个更大的内存更大的服务器,但这只会使上传限制更大......并引入次要问题。)
或者是否有其他方式上传文件。
将其流式传输到本地文件;即使用FileOutputStream
代替ByteArrayOutputStream
。现在这又带来了另外两个问题:
没有简单的答案。但是,当您允许人员将文件上传到您的服务器时,这些问题就会出现。
答案 1 :(得分:0)
如果这是来自您的标记httpurlconnection建议的HttpURLConnection
上传,即您正在写入其输出流,则应使用分块或固定长度传输模式。否则HttpURLConnection
必须在内存中缓冲整个上传,以便在发送任何内容之前知道Content-length
。如果你让它块,或通过使用固定长度告诉它内容长度,它直接写入线。