HTTP 文件上传是一种通过 HTTP 协议将本地文件发送到远程服务器的机制。它允许用户从自己的设备(如电脑、手机)选择文件,并通过网络将这些文件传输到服务器进行存储、处理或其他操作。这是互联网应用中常见的功能,例如在社交媒体平台上传照片、在云存储服务上传文档等场景都会用到。
当进行文件上传时,通常使用 POST 请求方法,并且请求的 Content-Type 设置为 multipart/form-data。这种格式可以在一个请求中同时包含文件数据和其他表单数据(如文件的描述信息、上传者信息等)。在 multipart/form-data 请求中,数据被分成多个部分(part),每个部分都有自己的头部(header)和内容(content)。头部包含了如 Content-Disposition(用于描述部分的性质,例如是否是文件、文件名是什么等)和 Content-Type(用于描述部分的媒体类型)等信息。
下面示例将使用 Spring Boot 实现上传文件功能,然后通过 Feign 客户端调用文件上传接口。
服务端代码:
@PostMapping("/upload") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return new ResponseEntity<>("请选择要上传的文件", HttpStatus.BAD_REQUEST); } try { // 将文件保存到指定目录,这里假设保存到项目根目录下的 uploads 文件夹 File destination = new File("D:\\tmp\\uploads\\" + file.getOriginalFilename()); file.transferTo(destination); return new ResponseEntity<>("文件上传成功", HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>("文件上传失败:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } }
Feign 客户端代码:
// 上传文件 @PostMapping(value = "/simple/upload", consumes=MediaType.MULTIPART_FORM_DATA_VALUE) ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file);
注意:MediaType.MULTIPART_FORM_DATA_VALUE 是一个常量,用于表示 multipart/form-data 这种媒体类型。在 HTTP 通信中,它主要用于处理包含文件上传的表单数据或者复杂的表单数据(可能包含文件和其他非文件类型的数据)。
调用 Feign 客户端代码:
// 客户端代码,调用 Feign 上传文件 @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file) { return simpleFeign.uploadFile(file); }
使用 ApiFox 调用,输出如下图: