在 Spring 引导应用程序中从 Jersey 资源方法提供静态内容

Serving static content from Jersey resource method in a Spring Boot app

我将 Spring Boot 和 JAX-RS 组合用于我的 REST API。在我的 Spring Java 应用程序中,我的资源目录中有一个图像。我想用 URL 为这张图片提供服务,它应该是这样的:

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

像这样,我应该可以在我的 Angular 前端应用程序的 img 标签中使用这个 URL:

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

所以问题是,我真的很想把这些东西放在我的文件系统中。我绝对不想 return 一个字节数组,但这是迄今为止我唯一能找到的东西。到目前为止,这是我唯一能想到的代码:

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

显然,这只会 return 相应目录的路径,而不是我可以在我的 img 标签中使用的 URL link。

有什么建议可以让我的 SpringBoot JAX-RS 应用程序为我创建一个 URL 吗?

我可以为您提供解决方案,但绝对不推荐。主要原因是缺少缓存。您需要自己实现它,如果您让它为所有静态内容提供服务,它已经由服务器提供。

在 Spring Boot + Jersey 应用程序中,为了能够提供静态内容,您需要具有 spring-boot-starter-web 依赖项。然后你可以把你所有的静态资源放到src/main/resources/static1中。如果你把一个文件 /images/foobar.png 放在那个目录下,那么你可以通过 localost:8080/images/foobar.png.

访问它

如果你真的 真的想要从资源方法中提供静态内容(我再次强烈建议不要这样做),你不要到return一个byte[]。你 可以 只是 return 一个 File 或一个 InputStream。或者您可以使用 StreamingOutput(只需搜索一些示例 - 您应该不会有任何问题找到任何示例)。但是同样,使用这种方法,您需要注意发送所有正确的缓存 headers,否则浏览器不会缓存文件,每次请求时都会提供这些文件,这只会使用不必要的资源。


另见

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

1.还有更多的地方。参见 the docs