💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 在 Spring Boot 中提供图像文件 > 原文: [http://zetcode.com/articles/springbootserveimage/](http://zetcode.com/articles/springbootserveimage/) 在本教程中,我们展示了如何在 Spring Boot RESTful Web 应用中提供图像文件。 该图像是位于资源目​​录中的 JPEG 文件。 Spring 是用于开发 Java 企业应用的 Java 应用框架。 它还有助于集成各种企业组件。 Spring Boot 使创建具有 Spring 动力的生产级应用和服务变得很容易,而对安装的要求却最低。 我们将展示将图像数据发送到客户端的三种方式。 ## Spring 图像示例 该 Web 应用在`src/main/resources/image`目录中包含一个`sid.jpg`文件。 `ClassPathResource`用于获取图像文件。 ```java pom.xml src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── Application.java │ │ └── controller │ │ └── MyController.java │ └── resources │ └── image │ └── sid.jpg └── test └── java ``` 这是项目结构。 `pom.xml` ```java <?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>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</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> </plugin> </plugins> </build> </project> ``` 这是 Maven 构建文件。 Spring Boot 启动器是一组有用的依赖项描述符,可大大简化 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` ```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` ```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()); } } ``` 在此控制器中,我们获取图像资源并将其直接写入响应对象。 ```java var imgFile = new ClassPathResource("image/sid.jpg"); ``` 我们从类路径与`ClassPathResource`图片资源中(`src/main/resource`是在 Java 类路径)。 ```java response.setContentType(MediaType.IMAGE_JPEG_VALUE); ``` 响应的内容类型设置为`MediaType.IMAGE_JPEG_VALUE`。 ```java StreamUtils.copy(imgFile.getInputStream(), response.getOutputStream()); ``` 使用`StreamUtils`,我们将数据从图像复制到响应对象。 ### 用`ResponseEntity`提供图像 在第二种情况下,我们使用`ResponseEntity`。 `com/zetcode/controller/MyController.java` ```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[]>`。 ```java byte[] bytes = StreamUtils.copyToByteArray(imgFile.getInputStream()); ``` 使用`StreamUtils.copyToByteArray()`,我们将图像数据复制到字节数组中。 ```java return ResponseEntity .ok() .contentType(MediaType.IMAGE_JPEG) .body(bytes); ``` 字节数组提供给`ResponseEntity`的主体。 ### 使用`ResponseEntity`和`InputStreamResource`提供图像 在第三种情况下,我们使用`ResponseEntity`和`InputStreamResource`。 `InputStreamResource`是 Spring 对低级资源的抽象。 `com/zetcode/controller/MyController.java` ```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<InputStreamResource>`。 ```java return ResponseEntity .ok() .contentType(MediaType.IMAGE_JPEG) .body(new InputStreamResource(imgFile.getInputStream())); ``` `ResponseEntity`的主体返回`InputStreamResource`。 ```java $ mvn spring-boot:run ``` 我们启动 Spring Boot 应用。 我们导航到`http://localhost:8080/sid`在浏览器中显示图像。 在本教程中,我们展示了如何从 Spring Boot 应用向客户端发送图像数据。 我们使用了三种不同的方法。 您可能也对这些相关教程感兴趣:[用 Java 显示图像](/java/displayimage/), [Java 教程](/lang/java/)或列出[所有 Spring Boot 教程](/all/#springboot)。