我有一个实现文件下载的Java servlet。它包括以下代码:
String filename = request.getParameter("filename");
File file = new File(filename);
FileInputStream inputStream = null;
ServletOutputStream outputStream = response.getOutputStream();
ServletContext servletContext = getServletContext();
String mimeType = servletContext.getMimeType(filename);
if (mimeType == null)
mimeType = "application/octet-stream";
logger.trace("MIME type for " + filename + " is " + mimeType);
response.setContentType(mimeType);
response.setContentLength((int)file.length());
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
inputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
if (inputStream != null)
inputStream.close();
在服务器上我们有一个file.tar.gz,当浏览器发送下载该文件的请求时,我在日志文件中看到一行说“file.tar.gz的MIME类型是application / X-压缩程序”。但是,当我们将浏览器保存的文件与服务器上的文件进行比较时,它们就不一样了。
然后我注释掉了“if(mimeType == null)”行,以便MIME类型始终设置为“application / octet-stream”,并且下载的文件仍然与上面的文件不同服务器
知道为什么下载的文件与服务器上的文件不完全相同?
编辑:这真的很奇怪。我测试了一个文本文件,一个PDF文件,一个ZIP文件(在Windows中创建),一个JPG文件,它们都下载了精确的副本。只是这个file.tar.gz由于某种原因没有完全下载(在服务器上它是882,273字节,下载的副本是881,968字节)。编辑2:当我使用curl下载file.tar.gz时,它会被保存为精确副本,因此告诉我servlet代码没有任何问题。由于某种原因,Chrome会在保存文件之前对其进行修改。 Chrome是否可以检测到该文件是gzip压缩文件,并认为服务器压缩了响应(当它确实没有时),所以它会尝试解压缩它?然后,Chrome保存的文件小于服务器上的文件...
答案 0 :(得分:0)
此问题是由Chrome中的错误引起的,如下所述: https://code.google.com/p/chromium/issues/detail?id=268085
我们的网络服务器配置为对发送回浏览器的所有内容使用HTTP gzip压缩,因此由于Chrome错误,它最终使用另一层gzip压缩保存文件。