Spring Boot - 服务图像文件

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(452)   2023-06-26 07:54:18

在本教程中,我们展示了如何在 Spring Boot RESTful Web 应用程序中提供图像文件。该图像是位于资源目​​录中的 JPEG 文件。

春天是一个用于开发Java企业应用程序的Java应用程序框架。它还有助于集成各种企业组件。 Spring Boot 使创建 Spring 支持的生产级应用程序和服务变得容易,而且设置要求最低。

我们将展示三种将图像数据发送到客户端的方法。

弹簧图像示例

Web 应用程序在 src/main/resources/image 目录中包含一个 sid.jpg 文件。 ClassPathResource 用于获取图像文件。

pom.xml
src
├── main
│   ├── java
│   │   └── com
│   │       └── zetcode
│   │           ├── Application.java
│   │           └── controller
│   │               └── MyController.java
│   └── resources
│       └── image
│           └── sid.jpg
└── test
    └── java

这是项目结构。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>springimage</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.7</version>
            </plugin>
        </plugins>
    </build>

</project>

这是 Maven 构建文件。 Spring Boot starters 是一组有用的依赖描述符,它极大地简化了 Maven 配置。 spring-boot-starter-parent 有一些 Spring Boot 应用程序的通用配置。 spring-boot-starter-web 是使用 Spring MVC 构建 Web 应用程序的入门工具。它使用 Tomcat 作为默认的嵌入式服务器。 spring-boot-maven-plugin 在 Maven 中提供 Spring Boot 支持,允许我们打包可执行的 JAR 或 WAR 存档。它的 spring-boot:run 目标执行 Spring Boot 应用程序。

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

Application 设置 Spring Boot 应用程序。 @SpringBootApplication 启用组件扫描和自动配置。

使用 HttpServletResponse 服务图像

在第一种情况下,我们直接写入 HttpServletResponse

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @RequestMapping(value = "/sid", method = RequestMethod.GET,
            produces = MediaType.IMAGE_JPEG_VALUE)

    public void getImage(HttpServletResponse response) throws IOException {

        var imgFile = new ClassPathResource("image/sid.jpg");

        response.setContentType(MediaType.IMAGE_JPEG_VALUE);
        StreamUtils.copy(imgFile.getInputStream(), response.getOutputStream());
    }
}

在这个控制器中,我们获取图像资源并将其直接写入响应对象。

var imgFile = new ClassPathResource("image/sid.jpg");

我们使用 ClassPathResource 从类路径(src/main/resources 目录在 Java 类路径中)获取图像资源。

response.setContentType(MediaType.IMAGE_JPEG_VALUE);

响应的内容类型设置为 MediaType.IMAGE_JPEG_VALUE

StreamUtils.copy(imgFile.getInputStream(), response.getOutputStream());

使用 StreamUtils,我们将数据从图像复制到响应对象。

使用 ResponseEntity 提供图像

在第二种情况下,我们使用 ResponseEntity

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import java.io.IOException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @RequestMapping(value = "/sid", method = RequestMethod.GET,
            produces = MediaType.IMAGE_JPEG_VALUE)
    public ResponseEntity<byte[]> getImage() throws IOException {

        var imgFile = new ClassPathResource("image/sid.jpg");
        byte[] bytes = StreamUtils.copyToByteArray(imgFile.getInputStream());

        return ResponseEntity
                .ok()
                .contentType(MediaType.IMAGE_JPEG)
                .body(bytes);
    }
}

getImage() 方法返回类型设置为 ResponseEntity

byte[] bytes = StreamUtils.copyToByteArray(imgFile.getInputStream());

使用 StreamUtils.copyToByteArray(),我们将图像数据复制到字节数组中。

return ResponseEntity
        .ok()
        .contentType(MediaType.IMAGE_JPEG)
        .body(bytes);

字节数组提供给 ResponseEntity 的主体。

使用 ResponseEntity 和 InputStreamResource 提供图像

在第三种情况下,我们使用 ResponseEntityInputStreamResourceInputStreamResource 是 Spring 对底层资源的抽象。

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import java.io.IOException;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @RequestMapping(value = "/sid", method = RequestMethod.GET,
            produces = MediaType.IMAGE_JPEG_VALUE)
    public ResponseEntity<InputStreamResource> getImage() throws IOException {

        var imgFile = new ClassPathResource("image/sid.jpg");

        return ResponseEntity
                .ok()
                .contentType(MediaType.IMAGE_JPEG)
                .body(new InputStreamResource(imgFile.getInputStream()));
    }
}

getImage() 方法返回类型设置为 ResponseEntity

return ResponseEntity
        .ok()
        .contentType(MediaType.IMAGE_JPEG)
        .body(new InputStreamResource(imgFile.getInputStream()));

ResponseEntity 的主体返回一个 InputStreamResource

$ mvn spring-boot:run

我们启动 Spring Boot 应用程序。

我们导航到 http://localhost:8080/sid 以在浏览器中显示图像。

在本教程中,我们展示了如何从 Spring Boot 应用程序向客户端发送图像数据。

地址:https://www.cundage.com/article/springboot-serveimage.html

相关阅读

Spring Boot Vue.js 教程展示了如何使用 Vue.js 框架创建一个简单的 Spring Boot。 Vue.js Vue.js 是一个用于构建用户界面的 JavaScript ...
JavaScript 是否已经取代 Java 成为新的“一次编写,随处运行”的编程语言?这完全取决于您的观点。随着 WebAssembly 等技术的出现,Java 可以在新奇的“一次编写,随处编...
Usage of TypeScript,微软基于 JavaScript 的强类型语言, has soared compared to six years ago, according to th...
云莓将基于 Spring 构建的 Java 后端与使用 Lit 构建的 TypeScript 前端相结合,一个快速、响应式的 JavaScript 框架。基于 Vaadin Fusion 的 H...
本博客严重偏向于 GWT(和基于 GWT 的框架),但我们牢记 GWT 将来可能会被其他技术接管,因此我们始终对探索其他平台/框架持开放态度。正如他们所说,多元化可以降低风险。每种编程语言,即使...
Java JSON 教程展示了如何使用 JSON-Java 在 Java 中进行 JSON 序列化和反序列化。 JSON(JavaScript 对象显示法) 是一种轻量级数据交换格式。人类易于读...
JHipster 是一个长期存在且雄心勃勃的混合 Java 和 JavaScript 项目,致力于使用现代反应式前端简化全栈 Java 应用程序的开发。 JHipster 开发团队不断发布新版本...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Spring Boot JSON 教程展示了如何在 Spring Boot 注释中提供 JSON 数据。 春天 是一个流行的 Java 应用程序框架,弹簧贴 是 Spring 的演变,有助于创建...
根据最近一项全球开发人员调查,在开发人员偏好方面,JavaScript 和 Python 保持了持久力,而 锈 的使用率正在上升. 5 月 4 日的一份题为“开发者国家情况,第 22nd 版”的...