我正在尝试创建一个Java servlet,它将下载一个要在浏览器窗口中打开的文件(如果浏览器无法查看,则下载该文件)。例如,我正在尝试在浏览器中获取和查看PNG图像。
我尝试通过Fiddler发送没有标题的请求(Host: localhost
除外),然后我找回了我要查找的图片。
当我尝试使用相同的URL在我的浏览器中查看图像时,我得到一个无效(透明)图像。我尝试将浏览器(Chrome)中的标题添加到Fiddler,当我添加以下标题时看起来它失败了:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
当我删除该标题或将其更改为Accept: */*
时,图像会再次加载。我查看了Fiddler中的原始响应,发现发回的实际数据存在细微差别。
这就是我的servlet代码的样子。我没有手动检查Accept标头:
byte[] data = getData();
response.setContentType("image/png");
response.setHeader("Content-disposition", "inline; filename=\"my_image.png\"");
response.setContentLength(data.length);
OutputStream output = response.getOutputStream();
output.write(data);
output.close();
为什么Chrome的默认Accept标头使我的回复无法读取?如何让我的servlet忽略该标头并每次发回相同的数据?
修改
当我请求没有Accept标头的servlet时,这就是Fiddler在“Raw”视图中显示的内容(好):
HTTP/1.1 200 OK
x-xr-bookmark: ad70ff81-7415-4d46-954d-b79f98056729
content-disposition: inline; filename="image.PNG"
content-type: image/png
content-length: 82726
date: Tue, 21 Mar 2017 19:49:32 GMT
connection: close
PNG
IHDR 5- sRGB gAMA
a pHYs t t fx IDATx^ {p\ } &M $mg I K; N3 t`
*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***
当我用上面提到的Accept标题请求它时,这就是Fiddler所显示的(不好):
HTTP/1.1 200 OK
x-xr-bookmark: 5a1b1e6d-6b68-42ac-a2cb-545811f9a879
content-disposition: inline; filename="image.PNG"
content-type: image/png
date: Tue, 21 Mar 2017 19:49:46 GMT
connection: close
Transfer-Encoding: chunked
258ec
PNG
IHDR 5- sRGB gAMA
a pHYs t t fx IDATx^ {p\ } &M $mg I K; N3
*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***