在Spring Boot应用程序中通过Jersey资源方法提供静态内容

时间:2018-07-20 12:25:55

标签: java angular spring-boot jersey jax-rs

我正在将Spring Boot和JAX-RS结合用于我的REST API。在我的Spring Java Application中,我的资源目录中有一个映像。我想用网址提供这张图片,应该是这样的:

localhost:8080/api/get/img/1/imageFileName.png

像这样,我应该可以在img标签的Angular Frontend Application中使用此URL:

<img src="localhost:8080/api/get/img/1/imageFileName.png"/>

所以问题是,我真的很想在我的FileSystem中拥有这些东西。我绝对不想返回字节数组,但这是到目前为止我唯一能找到的东西。这是到目前为止我唯一能想到的代码:

@GET
@Path("get/img/1")
public String getFile() {
    File file = Paths.get(".", "resources", "Mockup9EventsPageAsMember.png").normalize().toFile();
    return file.toString();
}

很显然,这只会返回到相应目录的路径,而不是我可以在img标签中使用的URL链接。

关于如何告诉SpringBoot JAX-RS应用程序为我创建URL的任何建议?

1 个答案:

答案 0 :(得分:0)

我可以为您尝试做的事情提供解决方案,但是绝对不建议这样做。主要原因是缺少缓存。您需要自己实现,如果让服务器提供所有静态内容,则服务器已经提供了该功能。

在Spring Boot + Jersey应用程序中,要能够提供静态内容,您需要具有spring-boot-starter-web依赖性。然后,您可以将所有静态资源放入src/main/resources/static 1 中。如果将文件/images/foobar.png放在该目录中,则可以通过localost:8080/images/foobar.png访问它。

如果您真的 真的想要提供资源方法中的静态内容(我再次强烈反对),那么您就没有返回byte[]。您可以只返回一个File或一个InputStream。或者,您可以使用StreamingOutput(仅搜索一些示例-查找任何示例都不会有问题)。但是,再次使用此方法,您需要注意发送所有正确的缓存头,否则浏览器将不会缓存文件,而是在每次请求文件时就将它们提供服务,而这只会使用不必要的资源。


另请参见

  • 如果您在访问静态内容时遇到问题,则可能与this issue
  • 有关

1。还有更多的位置。参见the docs