我在Spring4应用程序中上传文件存在问题。
TL;博士
.xlsx文件上传后,我们有比原版更大的文件。另外,我们无法使用Microsoft Office打开它。
问题
我已经检查了每个教程,并以各种方式实现了实现。除了XLSX之外,它几乎适用于所有文件类型。
方案
我正在使用文件(例如,首先来自http://www.sample-videos.com/download-sample-xls.php)
在终端:
$ ls -la | grep .xlsx
-rw-r--r--@ 1 user staff 19K 31 mar 13:46 SampleXLSFile_19kb.xlsx
19KB
但上传后,我有:
$ ls -la | grep .xlsx
-rw-r--r-- 1 user staff 24K 31 mar 13:47 SampleXLSFile_19kb.xlsx
whaaat!? 24K?
调试完成后,我已经知道该文件位于Jboss临时目录中,具有新的更大的大小。
有什么问题?
上传后我无法在excel中打开.xslx文件,我无法在应用程序中处理它们。文件已损坏。
你有什么想法吗? 我可以看到,只有xlsx文件存在问题。
示例上传代码:
@RequestMapping(value = "/api/file", method = RequestMethod.POST)
public ResponseEntity upload(@RequestParam("file") MultipartFile file) throws Exception {
if (!file.isEmpty()) {
try {
BufferedOutputStream stream = new BufferedOutputStream(
new FileOutputStream(new File(this.uploadDirectory + "/" + file.getOriginalFilename())));
FileCopyUtils.copy(file.getInputStream(), stream);
stream.close();
} catch (Exception e) {
throw new Exception(e);
}
}
return new ResponseEntity(null, HttpStatus.OK);
}
正如你所看到的 - 没什么特别的。
@UPDATE
看起来只有.xslx文件没有问题。二进制文件也存在问题。
我发现,org/apache/commons/fileupload/MultipartStream.java
导致了这个问题。看起来它从内部读取太多字节并保存更大的文件
例如,我上传了43M的zip文件,但最后我收到了78M的zip文件。
@SOLVED
原来,这是一些内部应用程序问题。我们有一个spring过滤器,它管理当前请求以提取一些数据进行记录。过滤器运行得很早,因此上传机制会从我们的过滤器中获取损坏的数据。