HTML Object 来自动态源的数据 URL

HTML Object data URL from dynamic source

所以我的应用程序的所有上传都没有存储在我的网络服务器中 space,它们存储在文件系统存储中。当我的用户想要访问他们调用 URL 的文件时,后端进程将通过 HttpServletResponse 输出流将数据缓冲到浏览器。这非常适合下载文件。现在我的 use-case 有一个场景,我需要使用相同的方法加载嵌入式 object。

我实际上是在浏览器中加载 PDF 文件的预览。如果 PDF 存储在网络服务器上并且我直接向文件提供 URL,则此方法工作正常。但是当我使用我的方法向用户发送文件时,它就不起作用了。

<object data='"+pdfUrl+"' type='application/pdf' width='160px' height='160px' />

如果我将 pdfURL 放入浏览器,我的文件下载没有问题。所以我认为问题是我在输出流中发送的 HTTP headers 可能会阻止 Object 正确加载。我不确定它是否期望设置特定的内容以触发加载文件

我目前正在使用非常基本的 headers 如下:

BufferedInputStream is = <Some File Inputstream>;
resp.setContentType(new MimetypesFileTypeMap().getContentType(directory+filename));
resp.setHeader("Content-Disposition", "attachment;  filename="+StringFormatHelper.formatFileName(filename));
bufferedCopy(is, resp.getOutputStream());
is.close();
resp.getOutputStream().flush();

有人知道我必须更改哪些内容才能使数据正确加载到 Object 标记中吗?我在 JS 控制台或服务器端没有收到任何错误。我不确定如何调试这个问题。

编辑: 所以我刚刚意识到,如果我右键单击空白 Object 标签所在的位置,我可以选择 "Save as...",当我这样做时,我会下载 PDF。所以 pdf 数据已加载,但它只是没有显示在 UI.

问题出在这行代码

resp.setContentType(new MimetypesFileTypeMap().getContentType(directory+filename));

我没有为文件设置正确的 mime-type。因此,Object 标记正在寻找 application/pdf 但服务器在 header 中发送了不同的 MIME 类型,因此存在不匹配。一旦我将它们匹配起来,一切都会成功。

我能够使用 Spring 提供的查找而不是 JDK 查找

获得正确的 MIME 类型
new ConfigurableMimeFileTypeMap().getContentType(directory+filename)