龙空技术网

SpringBoot 文件上传和下载(五)

JU帮 187

前言:

眼前看官们对“struts文件上传下载”都比较重视,兄弟们都想要了解一些“struts文件上传下载”的相关知识。那么小编在网摘上收集了一些关于“struts文件上传下载””的相关资讯,希望兄弟们能喜欢,大家一起来学习一下吧!

在第一篇文章《SpringBoot 文件上传和下载(一)》中,我们介绍了 HTTP 中关于 MIME 类型、HTTP Header Content-Type 和 Content-Disposition 的内容。

在后续第二到第四篇文章中,我们介绍了如何通过 HTML 页面、HTTP 工具、Spring RestTemplate 发送文件上传的请求。但是发送的这些请求除了文件之外的其他字段使用的是简单的 K-V 值,下面我们介绍,文件上传如何发送和接收复杂的数据类型,如 JSON、XML 等。

创建接收文件上传请求的 Controller

该 Controller 和《SpringBoot 文件上传和下载(二)》示例中的 Controller 的区别有两点:

就是将除 MultipartFile 参数以外的其他参数封装到 UploadFileRequestVO 实体中,并将该实体作为本示例 Controller 的入参UploadFileRequestVO 实体参数使用 @RequestPart 注解标识

@Data@Accessors(chain = true)@NoArgsConstructor@AllArgsConstructorpublic class UploadFileRequestVO implements Serializable {    /**     * 文件描述信息     */    private String fileDesc;    /**     * 文件过期时间     */    private String expirationTime;}
@Slf4j@RestControllerpublic class UploadFileController {    // 本示例中的上传文件方法    @PostMapping("/test/upload2/file")    public String upload2(@RequestPart UploadFileRequestVO requestVO,                          @RequestParam MultipartFile fileContent) {        log.info("文件上传信息:requestVO={}; fileName={}", requestVO,                  fileContent.getOriginalFilename());        return "SUCCESS";    }    // 《SpringBoot 文件上传和下载(二)》示例中的 Controller 上传文件方法    @PostMapping("/test/upload/file")    public String upload(@RequestParam String fileDesc, @RequestParam String expirationTime,                         @RequestParam MultipartFile fileContent) {        log.info("文件上传信息:fileDesc={}; expirationTime={}; fileName={}", fileDesc,                expirationTime, fileContent.getOriginalFilename());        return "SUCCESS";    }}
创建测试代码

本示例使用 RestTemplate 发送请求,代码如下:

@Slf4j@SpringBootTestclass UploadFileTest {    @Autowired    private RestTemplate restTemplate;    @Test    public void testUpload2() {        final String url = ";;        final String filePath = "C:\\Users\\jxrt\\Desktop\\upload-files\\txt-test-file.txt";        File file = new File(filePath);        MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder();        bodyBuilder.part("fileExtInfo", new UploadFileRequestVO("文件描述信息", "2023-12-25"),                          MediaType.APPLICATION_JSON);        bodyBuilder.part("fileContent", new ByteArrayResource(FileUtil.readBytes(file)),                          MediaType.APPLICATION_OCTET_STREAM).filename(file.getName());        HttpHeaders headers = new HttpHeaders();        headers.setContentType(MediaType.MULTIPART_FORM_DATA);        HttpEntity<MultiValueMap<String, HttpEntity<?>>> requestEntity =           new HttpEntity<>(bodyBuilder.build(), headers);        ResponseEntity<String> responseEntity =           restTemplate.postForEntity(url, requestEntity, String.class);        log.info("响应信息:{}", responseEntity.getBody());    }}

本示例中的测试代码与《SpringBoot 文件上传和下载(四)》中的测试代码区别如下:

使用 UploadFileRequestVO 实例作为 fileExtInfo 参数的值fileExtInfo 参数的 Content-Type 为 application/json,因为我们需要将该对象序列化为 JSON 字符串

启动服务,执行测试代码,可以正常发送和接收,输出结果如下:

文件上传信息:fileExtInfo=UploadFileRequestVO(fileDesc=文件描述信息, expirationTime=2023-12-25); fileName=txt-test-file.txt

@RequestBody & @RequestParam & @RequestPart

Spring 提供绑定请求参数和对应 Controller 方法参数映射的注解有三个,分别为:@RequestBody、@RequestParam、@RequestPart,下面我们介绍一下这三个注解的使用场景和区别。

HTTP 请求方式以我们最常用的 GET 和 POST 请求为例。

@RequestParam

@RequestBody 用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型),也就是我们常用的 Query 参数拼接,例如:?name=张三&age=12

通常我们用于接收 GET 请求参数或 POST 简单的 String 类型的值。

@RequestBody

处理 HttpEntity 传递过来的数据,一般用来处理非 Content-Type 为 application/x-www-form-urlencoded 编码格式的数据。可以处理 application/json 或者是 application/xml 等,一般情况下来说常用其来处理 application/json 类型。

在 GET 请求中,因为没有 HttpEntity,所以 @RequestBody 并不适用。

通常用于接收 POST Json 类型的值。

@RequestPart

@RequestPart 这个注解用在 Content-Type 为 multipart/form-data 表单提交请求的方法上。可以接收提交的任何类型数据(文件流、String 类型的值、Json 等复杂类型的值)。

@RequestParam 也同样支持 multipart/form-data 请求,但是只能用于接收文件流和 String 类型的值。

所以在上面实例中使用 @RequestPart 接收 Json 类型的数据映射到 UploadFileRequestVO 实例,建议如果 Content-Type 为 multipart/form-data 表单,使用 @RequestPart 接收参数。

文件下载内容见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。

上一篇:SpringBoot 文件上传和下载(四)

标签: #struts文件上传下载