我们在简单的文件上传系统中遇到了一个奇怪的问题。
设置是:Spring 3.2.2, commons fileupload 1.3, commons io 2.4。实际上,我们直接从Eclipse运行,使用外部Tomcat 7.0.40。它已经在Mac OS X 10.8和10.6上进行了测试。
代码如下:
public void saveFile(MultipartFile file, String description) {
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize());
OutputStream out = new FileOutputStream("someFileName");
IOUtils.copy(file.getInputStream(), out);
out.flush();
out.close();
}
它输出正确的文件名和正确的文件大小!
现在,当要将文件写入磁盘时,它会生成一个0字节的文件。这尤其发生在.docx
文件中(大约95%的情况下)。这似乎取决于文件。图片和PDF文档似乎总是有效。
没有异常或任何其他提示。调试器说InputStream
是空的(不是null
,只是空的)
对这种行为有什么解释吗?
我会检查以下内容:
- 您的服务器是否有防病毒/恶意软件来防止未知程序将docx写入文件系统
- 运行服务器的操作系统用户(因此将文件写入FS)是否有足够的权限这样做?
- InputStream empty可能意味着上传的文档以EOF开头。还要检查docx本身的内容,也许它已经损坏/一些文件编码问题导致多字节字符解释为EOF。我可能会通过打印十六进制 的前几个字节来调试docx。