在 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/static
1中。如果你把一个文件 /images/foobar.png
放在那个目录下,那么你可以通过 localost:8080/images/foobar.png
.
访问它
如果你真的 真的想要从资源方法中提供静态内容(我再次强烈建议不要这样做),你不要有到return一个byte[]
。你 可以 只是 return 一个 File
或一个 InputStream
。或者您可以使用 StreamingOutput
(只需搜索一些示例 - 您应该不会有任何问题找到任何示例)。但是同样,使用这种方法,您需要注意发送所有正确的缓存 headers,否则浏览器不会缓存文件,每次请求时都会提供这些文件,这只会使用不必要的资源。
另见
- 如果您在访问静态内容时遇到问题,可能与 this issue
有关
1.还有更多的地方。参见 the docs
我将 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/static
1中。如果你把一个文件 /images/foobar.png
放在那个目录下,那么你可以通过 localost:8080/images/foobar.png
.
如果你真的 真的想要从资源方法中提供静态内容(我再次强烈建议不要这样做),你不要有到return一个byte[]
。你 可以 只是 return 一个 File
或一个 InputStream
。或者您可以使用 StreamingOutput
(只需搜索一些示例 - 您应该不会有任何问题找到任何示例)。但是同样,使用这种方法,您需要注意发送所有正确的缓存 headers,否则浏览器不会缓存文件,每次请求时都会提供这些文件,这只会使用不必要的资源。
另见
- 如果您在访问静态内容时遇到问题,可能与 this issue 有关
1.还有更多的地方。参见 the docs