spring boot 图片上传与显示功能实例详解
一、环境搭建
- 创建Spring Boot项目
- 可以使用Spring Initializr(https://start.spring.io/)来创建一个基本的Spring Boot项目。选择合适的项目元数据,如项目名称、包名、依赖等。至少要添加
Spring Web依赖以便处理HTTP请求。 - 项目结构
- 一个典型的Spring Boot项目结构如下:
src/main/java:包含Java源代码。src/main/resources:存放配置文件(如application.properties或application.yml)、静态资源(如HTML、CSS、JavaScript文件等)。在这个例子中,我们将上传的图片存储在项目的特定目录下,可以是src/main/resources/static/images(假设我们想通过浏览器直接访问图片时的一种存放方式)。
二、图片上传功能实现
- 创建文件上传的控制器类
- 在
src/main/java下创建一个controller包,在其中创建FileUploadController类。 - 示例代码如下: ```java import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths;
@RestController public class FileUploadController {
private static String UPLOADED_FOLDER = "src/main/resources/static/images/";
@PostMapping("/upload")
public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return new ResponseEntity<>("Please select a file to upload", HttpStatus.OK);
}
try {
byte bytes = file.getBytes();
Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
Files.write(path, bytes);
return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
return new ResponseEntity<>("Error uploading file", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
``
- 上述代码中,@RestController注解表示这是一个处理HTTP请求并返回JSON等数据的控制器类。@PostMapping("/upload")指定了处理POST请求到/upload路径的方法。@RequestParam("file")用于接收名为file的文件参数,这里是一个MultipartFile类型,表示上传的文件。
- 在方法内部,首先检查文件是否为空,如果为空则返回相应提示。然后将文件字节写入到指定的路径下(这里是src/main/resources/static/images/目录下,文件名为原始文件名)。如果写入过程中出现IOException`,则返回错误信息。
- 配置文件上传大小限制(可选)
- 在
application.properties(或application.yml)中可以配置文件上传大小限制。 - 对于
application.properties:properties spring.servlet.multipart.max - file - size = 10MB spring.servlet.multipart.max - request - size = 10MB - 这表示单个文件上传最大为10MB,整个请求的文件上传总量最大也为10MB。
三、图片显示功能实现
- 直接通过静态资源访问(假设图片存储在
src/main/resources/static/images) - 如果图片存储在
src/main/resources/static/images目录下,在Spring Boot中,默认情况下,这个目录下的静态资源是可以直接通过浏览器访问的。例如,如果上传了一个名为test.jpg的图片,那么可以通过http://localhost:8080/images/test.jpg(假设Spring Boot应用运行在http://localhost:8080)来访问这个图片。 - 返回图片的字节流(另一种方式)
- 可以创建一个控制器方法来返回图片的字节流,这在一些场景下是很有用的,比如需要对图片访问进行权限控制等情况。
- 在
FileUploadController类中添加如下方法:java @GetMapping("/images/{filename}") public ResponseEntity<byte> getImage(@PathVariable("filename") String filename) { try { File file = new File(UPLOADED_FOLDER + filename); byte image = Files.readAllBytes(file.toPath()); return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(image); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } - 上述代码中,
@GetMapping("/images/{filename}")用于处理GET请求到/images/{filename}路径的情况,其中{filename}是一个路径变量,表示要获取的图片文件名。在方法内部,首先根据文件名构建File对象,然后读取文件的字节流,返回一个ResponseEntity,设置了ContentType为IMAGE_JPEG(如果是其他类型图片,需要相应修改),并将字节流放在body中。如果出现IOException,则返回500内部服务器错误状态的ResponseEntity。
本篇文章所含信息均从网络公开资源搜集整理,旨在为读者提供参考。尽管我们在编辑过程中力求信息的准确性和完整性,但无法对所有内容的时效性、真实性及全面性做出绝对保证。读者在阅读和使用这些信息时,应自行评估其适用性,并承担可能由此产生的风险。本网站/作者不对因信息使用不当或误解而造成的任何损失或损害承担责任。
