gpt4 book ai didi

java - Spring 中通过 ClassPathResource 提供二进制 (pdf) 文件的编码不正确

转载 作者:行者123 更新时间:2023-12-01 19:57:04 25 4
gpt4 key购买 nike

我已经为以下问题苦苦挣扎了两天,但无法解决它。

我正在尝试在 Spring Boot Rest 应用程序中提供静态 pdf。它应该非常简单,但我就是无法让它工作。

首先,我只是将 pdf 放在资源文件夹中,并尝试直接从 javascript 代码加载它,如下所示:

var newWindow = window.open(/pdf/test.pdf, ''); 

这会导致一个新窗口中的 pdf 文件不显示任何内容。

从浏览器将 pdf 保存到磁盘并调查内容发现它们与原始内容不同。我显示了 Atom 的屏幕截图(首先是原始屏幕截图),采用 ISO-8859-1 编码:

snippet from original pdf same part, pdf as saved from browser

到目前为止我的结论是:Spring 或 Tomcat 以某种方式改变了二进制内容。也许它正在编码?在 Base64 中?

然后我尝试在服务器端实现它,看看发生了什么。我实现了一个休息 Controller 来提供 pdf 内容。

一个有趣的发现是,它最初给出了与直接方法相同的结果。我使用 classPathResource 来获取 pdf 文件的句柄。

但是当我使用 FileInputStream 和 File 直接从路径加载 pdf 时,它可以工作。请参阅下面的代码:

    @RequestMapping(value = "/test.pdf", method = RequestMethod.GET, produces = "application/pdf")
public void getFile(HttpServletResponse response) {
try {
DefaultResourceLoader loader = new DefaultResourceLoader();

/* does not work
ClassPathResource pdfFile = new ClassPathResource("test.pdf");
InputStream is = pdfFile.getInputStream();
*/

/* works */
InputStream is = new FileInputStream(new File("z:\\downloads\\test.pdf"));


IOUtils.copy(is, response.getOutputStream());

response.setHeader("Content-Disposition", "inline; filename=test.pdf");
response.setContentType("application/pdf");

response.flushBuffer();

} catch (IOException ex) {
throw new RuntimeException("IOError writing file to output stream");
}
}

这是怎么回事?为什么 Spring/Tomcat 在使用 ClassPathResource 或直接提供服务时会更改二进制数据?

如果您能在这里提供一些帮助,我将不胜感激。我无法使用直接路径,因为 pdf 最终将位于 jar 文件中,因此我需要 ClassPathResource 或其他一些 ResourceLoader。

最佳答案

好吧,我终于找到了罪魁祸首,而且是在一个完全意想不到的角落。

我在这个项目中使用 IntelliJ 和 Maven,事实证明,IntelliJ 在将 pdf 复制到/target 文件夹时损坏了 pdf 的内容。当然,tomcat 正在提供这个文件,而不是/src 文件夹中的文件......所以它与 ClassPathResource 或 Spring 无关。这是 Maven。

我必须在 pom.xml 中禁用(二进制)pdf 的过滤:

        <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>

解决了这个问题。现在,文件的直接请求(localhost:8080/test.pdf)以及其余 Controller 方法都可以工作。 @Andy Brown:感谢您的快速回复,尽管它没有解决问题。

关于java - Spring 中通过 ClassPathResource 提供二进制 (pdf) 文件的编码不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49294378/

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