Servlets servlet中的文件上载会损坏文件

Servlets servlet中的文件上载会损坏文件,servlets,file-upload,ajax-upload,Servlets,File Upload,Ajax Upload,我正在使用using()上传一个文件,并在服务器端使用servlet。文件类型为application/pdf。代码是: String filename= request.getHeader("X-File-Name"); InputStream is = request.getInputStream(); File tmp = File.createTempFile(filename, ""); tmp.deleteOnExit(); FileOutputStream fos = new Fi

我正在使用using()上传一个文件,并在服务器端使用servlet。文件类型为application/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中不可能有其他输入参数。此外,上面代码中的字节数组与下载时的字节数组相同。为什么数据会损坏?

您的问题可能是正在读取的数据长度。我有类似的问题,并张贴在这个问题的链接


希望这有帮助

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