gpt4 book ai didi

http - 应该如何指定文档的响应内容类型以便跨浏览器一致地工作?

转载 作者:可可西里 更新时间:2023-11-01 16:27:26 26 4
gpt4 key购买 nike

我正在开发一个应该通过 http 提供文档的简单 servlet。我使用/getDocument?fileId=1234 形式的 URL。 servlet 只需 1) 设置 response.contentType 和 2) 写入 response.outputStream。

问题在于正确设置内容类型以使浏览器理解响应(即使用正确的应用程序显示文档)。具体来说:

a) 对于 PDF 文件,如果我将内容类型设置为“application/pdf”,Internet Explorer 可以理解(立即显示文档)但 Firefox 不能(显示空白页面而不尝试打开任何 pdf 查看器插件)。如果我将它设置为“application/x-octetstream”,Firefox 会理解它(正确显示它),但 Internet Explorer 在要求我保存或打开它时会说“未知文件类型”。

b) Firefox 理解“application/msword”和“application/vnd.ms-excel”,但 Internet Explorer 理解,奇怪的是,它不理解,它只是说“未知文件类型”。

是否有可能让它在所有浏览器中一致地工作,如果是这样,为各种文档类型设置内容类型的正确方法是什么?是否有任何其他应该设置在响应中才能使其正常工作?或者,正如我怀疑的那样,当 URL 不以相应的文件扩展名结尾时,浏览器是否会感到困惑? (即 getFile?fileId=1234 而不是 getFile/test.pdf)

最佳答案

在 servlet 中,响应内容类型应该设置如下:

response.setContentType(getServletContext().getMimeType(filenameWithExtension));

ServletContext#getMimeType() 查找所有 <mime-mapping> web.xml 中的条目对于与某些文件扩展名关联的内容类型。您可以在应用服务器自己的 web.xml 中找到所有默认映射。 (例如,Tomcat 位于 /conf/web.xml 中)。它可能缺少“新的”MSOffice OpenXML 文件扩展名,如 xlsx , docx等等。您可以将它们添加到您的网络应用程序的 web.xml如下所示:

<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>

至于浏览器如何处理内容类型和关联的应用程序,这里的主要问题是 MSIE。它忽略了 Content-Type header 和 filename Content-Disposition 的参数 header 。相反,它巧妙地根据 URL 中的文件扩展名猜测内容类型,并使用 URL 的最后一个路径信息作为文件名。因为您使用了像 /getDocument?fileId=1234 这样的请求参数文件名将变为 getDocument 而不是完整的文件名+扩展名而 MSIE 不能可靠地“猜测”它的 mime 类型。你真的应该在 URL 中包含文件名+扩展名,如 /getDocument/filename.ext .您可以在 Servlet 中获取该部分通过 request.getPathInfo() .有关更多 servlet 提示,请参阅 this article .

关于您的 Firefox 无法正确处理 PDF 文件的问题,这一定是您的 Firefox 配置错误。尝试在工具> 选项> 应用程序 中验证一切是否正确。也就是说,应该以正确的方式遵守上述 header 。您应该只确保任何 Content-Length header 已正确(!!)指定,否则无法打开文件。

关于http - 应该如何指定文档的响应内容类型以便跨浏览器一致地工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2244432/

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