前言:
眼前看官们对“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文件上传下载