如何使用角度和 Spring MVC 提供静态图像?

Posted

技术标签:

【中文标题】如何使用角度和 Spring MVC 提供静态图像?【英文标题】:How to serve an static image using angular and Spring MVC? 【发布时间】:2018-06-25 04:26:17 【问题描述】:

现在我创建了文件上传组件并将上传的文件保存在硬盘的物理路径中。那么,现在如何使用这个相对路径,当我想在新选项卡中右键单击打开图像时以角度提供这个图像时,它应该被转换为 localhost/port-number/image-path?

在应用程序属性中使用配置 我正在尝试在配置中使用外部 URL,但我不知道应该在此 URL 中设置什么 我需要做哪些更改才能提供图像。

【问题讨论】:

这里javasampleapproach.com/frontend/angular/…你可以找到java.nio.file是如何用来创建目录的以及获取目录下的所有文件并使用anugular和sprint-boot在UI中显示它 【参考方案1】:

Spring Content 就是为此而设计的。使用 Spring Content FS(即文件系统的 Spring Content),您可以通过定义单个接口来创建支持对内容进行 CRUD 操作的 REST 服务。

为此,将以下 Spring Content 依赖项添加到您的项目(假设为 maven):-

<dependencies>
    <!-- Standard Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.3</version>
    </dependency>

    <!-- Spring Content -->
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-fs-boot-starter</artifactId>
        <version>0.0.9</version>
    </dependency>
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest-boot-starter</artifactId>
        <version>0.0.9</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

在您的 Spring Boot 应用程序类中,创建一个 ImageStore。这指示 Spring Content 为这个接口注入一个 REST 服务,让您不必自己编写任何此代码(包括上传代码):-

    @SpringBootApplication 
    public class DemoApplication 

        public static void main(String[] args)         
           SpringApplication.run(DemoApplication.class, args);  
        

        @StoreRestResource(path="images")   
        public interface ImageStore extends Store<String>  
    

注意:顺便说一下,此服务也支持视频流!

请注意,默认情况下,Spring Content FS 将在 java.io.tmpdir 下创建一个存储上传的图像,并且每次启动应用程序时都会获得一个新的根目录。因此,您还需要设置 SPRING_CONTENT_FS_FILESYSTEM_ROOT 环境变量,为您的应用程序提供一个稳定的图像根目录”。

完成此操作后,您将能够使用任意路径将 POST(创建)、GET(读取)、PUT(更新)和 DELETE(删除)到 URI“/images”:-

/images/some/path/myimage.jpeg

例如,对该 URL 的 POST 会将图像存储到 SPRING_CONTENT_FS_FILESYSTEM_ROOT/some/path/myimage.jpeg。 GET 将再次检索它,依此类推。

【讨论】:

【参考方案2】:

如果硬盘路径在网络服务器的文档根目录内,您可以使用相对于文档根目录的 url 直接访问它。

示例: 硬盘里的文档根是/var/www/examplesite,你已经把文件theimage.jpg上传到/var/www/examplesite/uploads,然后以http://example.com/uploads/theimage.jpg访问图片

如果您已将文件上传到文档根目录之外,那么您需要实现一种机制来从其位置读取文件并从应用程序服务器或 servlet 容器中提供它。

查看本教程,它向您展示了如何使用 Spring MVC 将请求转发到 WEB-INF 文件夹内的资源。

Returning Image/Media Data with Spring MVC by baeldung

【讨论】:

是的,我刚刚上传了文件并将其保存在项目根目录外硬盘的物理路径中......现在想在项目中提供这些文件 我添加了一个教程,您可以在其中将响应转发到 WEB-INF 文件夹中的图像资源。我想它应该适用于服务器上的任何其他位置,但 WEB-INF 是放置非公共资源的地方。 使用 java.nio.file 访问文件目录签出此链接examples.javacodegeeks.com/core-java/nio/file-nio/path/…

以上是关于如何使用角度和 Spring MVC 提供静态图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC3 中通过 HTTPS 提供静态文件(在 ~/Content 中)

从源码角度深度剖析 Spring MVC

如何正确实现使用 Spring MVC\Boot 返回图像列表的 REST 服务?

Spring MVC:如何在@ResponseBody 中返回图像?

如何将 Azure 授权社交提供程序与静态 html 角度网站一起使用?

Spring:直接访问并提供网站目录之外的图像