在 Spring Boot 中,实现文件上传到服务器并返回静态资源的访问路径。这包括上传图片、保存到指定的目录,并返回访路劲

145 阅读2分钟

实现步骤

1. 创建上传接口

首先,你需要在控制器中创建一个上传文件的接口。

@RestController
@RequestMapping("/api")
public class FileUploadController {

    // 上传文件的方法
    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        // 指定上传文件保存的路径
        String uploadDirectory = System.getProperty("user.dir") + "/src/main/resources/static/uploads/";

        // 确保文件夹存在
        File directory = new File(uploadDirectory);
        if (!directory.exists()) {
            directory.mkdirs();
        }

        try {
            // 获取上传文件的原始文件名
            String fileName = file.getOriginalFilename();
            
            // 保存文件到指定路径
            Path filePath = Paths.get(uploadDirectory + fileName);
            Files.write(filePath, file.getBytes());

            // 返回访问图片的 URL
            String fileAccessUrl = "/uploads/" + fileName;
            return ResponseEntity.ok(fileAccessUrl);

        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败");
        }
    }
}
2. 配置静态资源访问路径

在 Spring Boot 中默认情况下,src/main/resources/static 目录下的文件会被作为静态资源公开。因此,上传的文件存储在这个目录下时,可以通过 HTTP 直接访问这些文件。

你可以在 application.properties 中配置静态资源路径,如果想要定制更多的静态资源路径,可以通过以下配置:

# 配置静态资源路径,默认配置下static目录下的文件可以直接通过"/uploads/"访问

spring.resources.static-locations=classpath:/static/ 这个配置会让 Spring Boot 自动映射 src/main/resources/static 目录中的文件。

3. 保存文件到 static/uploads 目录

在上面的控制器中,上传的文件会保存到 src/main/resources/static/uploads 目录,这样文件就可以通过 http://localhost:8080/uploads/{filename} 访问。

4. 完整代码示例
  • Controller (FileUploadController.java)
@RestController
@RequestMapping("/api")
public class FileUploadController {

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        String uploadDirectory = System.getProperty("user.dir") + "/src/main/resources/static/uploads/";

        File directory = new File(uploadDirectory);
        if (!directory.exists()) {
            directory.mkdirs();
        }

        try {
            String fileName = file.getOriginalFilename();
            Path filePath = Paths.get(uploadDirectory + fileName);
            Files.write(filePath, file.getBytes());

            String fileAccessUrl = "/uploads/" + fileName;
            return ResponseEntity.ok(fileAccessUrl);

        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败");
        }
    }
}

application.properties

# 静态资源配置,默认静态资源目录为 static
spring.resources.static-locations=classpath:/static/

5. 上传与访问文件
  • 上传接口:通过 POST 请求向 /api/upload 发送文件(表单类型 multipart/form-data)。
  • 文件上传成功后,将返回一个访问 URL,例如:http://localhost:8080/uploads/your-file-name.png