gpt4 book ai didi

Java 文件下载不是下载文件的精确副本

转载 作者:行者123 更新时间:2023-11-29 08:48:32 26 4
gpt4 key购买 nike

我有一个实现文件下载的 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-gzip”。但是当我们比较浏览器保存的文件和服务器上的文件时,它们是不一样的。

然后我注释掉“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 保存的文件再次小于服务器上的文件...

最佳答案

此问题的发生是由于 Chrome 中的错误,如下所述: https://code.google.com/p/chromium/issues/detail?id=268085

我们的网络服务器配置为对发送回浏览器的所有内容使用 HTTP gzip 压缩,因此由于 Chrome 错误,它最终使用另一层 gzip 压缩保存文件。

关于Java 文件下载不是下载文件的精确副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23899266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com