【发布时间】:2018-10-05 10:19:11
【问题描述】:
我正在使用以下方法将 MultipartFile 转换为文件:
public File convert(MultipartFile file) throws IOException {
File convFile = new File(file.getOriginalFilename());
convFile.createNewFile();
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}
Wich 工作很好,但对于大文件我得到了这个例外:
java.lang.OutOfMemoryError: Java heap space
我添加了更多堆,但仍然有错误。
那么有没有一种编程方式来解决这个问题,可能在转换时将多部分文件分成更小的块,但我不知道如何编码。
任何帮助或建议将不胜感激。
【问题讨论】:
-
file.getInputStream()将返回该流,对您有帮助吗? -
MulipartFile 应该有一个
toFile(file)方法。 -
new File(file.getOriginalFilename())。嗯,如果两个同时请求同时上传“untitled.pdf”会发生什么?各种各样的坏事,我想。另外,恶意用户将有一个现场日。我个人很想尝试“C:\Win32\whatever”或“~/bash.rc”作为示例名称(不要这样做!永远不要相信用户提交的内容) -
@GPI 实际上,我们永远不会有 2 个同名的文件,因为我在文件末尾附加了时间,如下所示:“untitled-09-10-2018-hh-mm-ss- ms.pdf"
-
好的,很高兴知道...但是您仍然有用户生成的前缀路径?那可能很危险。如果用户文件名包含 "/" 或 ":" 或 "\" 怎么办?我会将用户生成的名称视为元数据(如果不需要,也可以将其完全删除),并生成一个唯一的、FS 安全的名称(例如
Files.createXXXFile方法系列)。