因此,我的应用程序的所有上传都没有存储在我的Web服务器空间中,它们存储在文件系统存储中。当我的用户想要访问该文件时,他们调用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中显示。
答案 0 :(得分:0)
问题在于这行代码
resp.setContentType(new MimetypesFileTypeMap().getContentType(directory+filename));
这并没有像我想象的那样为文件设置正确的mime类型。因此,Object标记正在寻找application/pdf
,但服务器在标头中发送了不同的MIME类型,这是不匹配的。一旦我匹配它们就一切顺利。
我能够使用Spring提供的查找而不是JDK查找
来获取正确的MIME类型new ConfigurableMimeFileTypeMap().getContentType(directory+filename)