我想上传2MB - 10MB的图片到我的服务器并直接保存到硬盘。目标是尽可能多地节省 JVM 的堆内存,因为如果用户同时上传,我的系统不应崩溃。
我现在就是这样做的。当上传请求进入我的 Controller 时,我会:
CommonsMultipartFile file = (CommonsMultipartFile) request.getFile('image')
InputStream inputStream = file.inputStream
byte [] byteFile = inputStream.getBytes()
try{
def fullPath = // some image path and file name
def newFile = new FileOutputStream(fullPath)
newFile.write(byteFile)
newFile.close()
}
catch(IOException e){ }
Here我读到有 ImageIO 和 java.awt.Toolkit,其中 Toolkit 应该是存储文件最快的。
如何改进上传以尽可能少地使用堆并尽可能快地上传?
替代方案 1:
替代方案可能是:
CommonsMultipartFile file = (CommonsMultipartFile) request.getFile('image')
def fullPath = // some image path and file name
file.transferTo(new File(fullPath))
哪个更好?
最佳答案
您当前的代码接收包含文件内容的输入流,但随后将该流的全部内容缓冲在 byte[]
中,然后再将其写入磁盘上的文件。您的“替代方案 1”直接从输入流流到磁盘上的文件,因此内存效率更高,并且至少与当前的缓冲方法一样快(可能更快,因为沿途收集的垃圾更少)。
关于java - Java 中的内存高效文件/图像上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513894/