【问题标题】:HTML Object data URL from dynamic source来自动态源的 HTML 对象数据 URL
【发布时间】:2015-10-19 20:54:40
【问题描述】:

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

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

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

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

我目前使用的非常基本的标题如下:

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 控制台或服务器端没有收到任何错误。我不确定如何调试此问题。

编辑: 所以我刚刚意识到,如果我右键单击空白对象标签所在的位置,我可以选择“另存为...”,当我这样做时,我会下载 PDF。所以加载了 pdf 数据,但它只是没有显示在 UI 中。

【问题讨论】:

    标签: javascript java html http-headers


    【解决方案1】:

    问题是这行代码

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

    这并没有像我想象的那样为文件设置正确的 mime 类型。因此,对象标记正在寻找application/pdf,但服务器在标头中发送了不同的 MIME 类型,这是不匹配的。一旦我将它们匹配起来,一切正常。

    我能够使用 Spring 提供的查找而不是 JDK 查找来获得正确的 MIME 类型

    new ConfigurableMimeFileTypeMap().getContentType(directory+filename)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多