【问题标题】:File upload in servlet corrupts the fileservlet 中的文件上传会损坏文件
【发布时间】:2012-07-28 03:16:29
【问题描述】:

我正在使用 using (Valums uploader) 上传文件,并且我在服务器端使用 servlet。文件类型是应用程序/pdf。代码是:

String filename= request.getHeader("X-File-Name");
InputStream is = request.getInputStream();
File tmp = File.createTempFile(filename, "");
tmp.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tmp);
IOUtils.copy(is, fos);
byte[] bytes = new byte[(int) tmp.length()];
is.read(bytes);

现在这些字节作为 longblob 存储到数据库中。但似乎上面代码中的 inputStream 在文件中添加了更多数据,这就是文件数据被损坏的原因。我下载了与pdf文件相同的数据,发现原来上传的文件和现在下载的文件大小相同,但是当下载的文件在Acrobat中打开时,它报告“文件已损坏”。对于上传请求,我只使用了文件输入。因此 inputStream 中没有其他输入参数的机会。上面代码中的字节数组也是传递给下载的。为什么数据会损坏?

【问题讨论】:

  • 您正在编写整个请求。
  • 是的,我正在编写整个请求,因为在请求参数中只有一个输入是文件。 request.getParts() 给了我空集合。所以我没有使用它。
  • 这很好,但您可能想看看您实际上在写什么——我会这样做首先,然后确定如何 i> 它被损坏了。考虑使用类似Commons FileUpload 或类似的东西。
  • 谢谢..我想写inputStream数据,但是一旦inputStream被复制到fileOutputStream中,它就变成了空的。 is.read(bytes) 返回 -1(它返回读取的字节数)。所以 IOUtils.copy(is, fos);从上面的代码使“是”为空。并且在 bytes[] 数组中什么也不读取。这就是文件被损坏的原因。现在问题解决了,不需要创建临时文件和文件输出流。我们可以使用 inputStream 直接读取 bytes[] 数组,并可以使用“Content-Length”标头创建该大小的字节数组。

标签: servlets file-upload ajax-upload


【解决方案1】:

您的问题可能是您正在读取的数据长度。我有类似的问题并发布在这个问题链接上 Java: Binary File Upload using Restlet + Apache Commons FileUpload

希望对你有帮助

【讨论】:

  • 将链接中的相关内容添加到答案正文中。
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多