返回

SpringBoot:资源处理宝典,一个知识点的干货大汇总

后端

SpringBoot资源处理:文件上传下载、静态资源、ResponseBody、ResponseEntity和@RequestMapping

SpringBoot是一个强大的Java框架,它简化了Spring MVC开发。它提供了全面的资源处理功能,包括文件上传下载、静态资源处理、@ResponseBody、ResponseEntity和@RequestMapping等功能。本文将深入探讨这些主题,指导您轻松掌握SpringBoot资源处理技巧。

文件上传和下载

文件上传

要实现文件上传,您可以使用<input type="file">标签创建表单。然后,在控制器方法中使用MultipartFile接口接收上传的文件。最后,使用save()方法将文件保存在服务器上。

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    file.save("path/to/file");
    return "File uploaded successfully";
}

文件下载

要实现文件下载,可以使用ResponseEntity<Resource>返回文件资源。使用Content-Disposition头指定文件的下载名称。

@GetMapping("/download")
public ResponseEntity<Resource> download() {
    Resource resource = new FileSystemResource("path/to/file");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDisposition(ContentDisposition.attachment().filename("file.txt").build());
    return ResponseEntity.ok().headers(headers).body(resource);
}

静态资源处理

配置静态资源路径

要配置静态资源路径,请使用spring.mvc.static-path-pattern属性或使用addResourceHandlers()方法。

// 在application.properties中配置静态资源路径
spring.mvc.static-path-pattern=/static/**

// 使用addResourceHandlers()方法配置静态资源路径
@Configuration
public class StaticResourceConfiguration {
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/static/**").addResourceLocations("/static/");
            }
        };
    }
}

访问静态资源

使用<link><script><img>标签访问静态资源。

<link href="/static/css/style.css" rel="stylesheet">
<script src="/static/js/script.js"></script>
<img src="/static/images/image.png">

ResponseBody和ResponseEntity

@ResponseBody

@ResponseBody注解将方法的返回值直接返回给浏览器。返回值可以是字符串、对象、集合等。

@GetMapping("/data")
@ResponseBody
public List<String> getData() {
    return Arrays.asList("a", "b", "c");
}

ResponseEntity

ResponseEntity注解用于返回自定义的HTTP响应。它可以指定响应的状态码、响应头和响应体。

@GetMapping("/data-with-status")
public ResponseEntity<List<String>> getDataWithStatus() {
    return ResponseEntity.status(HttpStatus.OK).body(Arrays.asList("a", "b", "c"));
}

@RequestMapping注解

用法

@RequestMapping注解用于将请求路径映射到控制器方法上。它可以指定请求方法、请求参数和请求头。

@GetMapping("/path")
public String get() {
    return "get";
}

@PostMapping("/path")
public String post() {
    return "post";
}

简化注解

可以使用@PostMapping@GetMapping@PutMapping@DeleteMapping等注解简化代码。

@PostMapping("/path")
public String post() {
    return "post";
}

示例代码

@RestController
public class ResourceController {

    // 文件上传
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) {
        file.save("path/to/file");
        return "File uploaded successfully";
    }

    // 文件下载
    @GetMapping("/download")
    public ResponseEntity<Resource> download() {
        Resource resource = new FileSystemResource("path/to/file");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDisposition(ContentDisposition.attachment().filename("file.txt").build());
        return ResponseEntity.ok().headers(headers).body(resource);
    }

    // 静态资源处理
    @RequestMapping(value = "/static/**", method = RequestMethod.GET)
    public ResponseEntity<Resource> serveStaticResource(@PathVariable String path) {
        Resource resource = new FileSystemResource("path/to/static/" + path);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.valueOf("application/" + path.substring(path.lastIndexOf(".") + 1)));
        return ResponseEntity.ok().headers(headers).body(resource);
    }

    // 使用@ResponseBody返回数据
    @GetMapping("/data")
    @ResponseBody
    public List<String> getData() {
        return Arrays.asList("a", "b", "c");
    }

    // 使用ResponseEntity返回数据
    @GetMapping("/data-with-status")
    public ResponseEntity<List<String>> getDataWithStatus() {
        return ResponseEntity.status(HttpStatus.OK).body(Arrays.asList("a", "b", "c"));
    }
}

结论

SpringBoot的资源处理功能强大而灵活。它提供了文件上传下载、静态资源处理、ResponseBody、ResponseEntity和@RequestMapping等功能,帮助您轻松管理资源。通过掌握这些技术,您可以创建动态且可交互的Web应用程序。

常见问题解答

1. 如何在SpringBoot中上传多个文件?

您可以使用MultipartFile[]数组或List<MultipartFile>接收多个文件。

2. 如何使用SpringBoot从数据库中下载文件?

可以使用ResponseEntity<byte[]>返回文件字节数组,并设置Content-Disposition头指定文件名。

3. 如何配置SpringBoot使用CDN分发静态资源?

您可以在application.properties文件中配置CDN URL和密钥。

4. 如何使用@RequestMapping指定请求参数?

可以在@RequestMapping注解中使用@RequestParam注解指定请求参数。

5. ResponseEntity和@ResponseBody有什么区别?

ResponseEntity提供了对HTTP响应的更精细控制,而@ResponseBody会自动将对象转换为JSON。