feign调用传递文件流
时间: 2024-12-31 09:42:18 浏览: 19
### Feign Client 文件流上传与下载
#### 文件流上传
为了实现文件流的上传,`FeignClient` 需要配置支持 `MultipartFile` 类型的数据传输。这通常涉及到使用 `@RequestPart` 注解来指定请求体中的部分数据[^1]。
```java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
@FeignClient(name = "file-upload-service", url = "http://localhost:8080")
public interface FileUploadClient {
@PostMapping("/uploadFile")
String uploadFile(@RequestPart("file") MultipartFile file);
}
```
上述代码定义了一个名为 `file-upload-service` 的客户端接口,在 `/uploadFile` 路径下提供文件上传的服务。这里的关键在于 `@RequestPart("file") MultipartFile file` 参数声明,它告诉 Spring 这是一个多部件表单的一部分,并且应该作为文件处理[^2]。
对于实际的应用场景来说,还需要确保服务器端能够接收并保存这些文件。服务端控制器可以像下面这样设计:
```java
@PostMapping("/uploadFile")
public ResponseEntity<String> handleFileUpload(
@RequestParam("file") MultipartFile file) {
try {
// 处理文件...
return new ResponseEntity<>("Successfully uploaded - " + file.getOriginalFilename(), HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
}
}
```
#### 文件流下载
当涉及文件下载时,则可以通过返回字节数组或输入流的方式让前端获取到所需资源。以下是利用 `ResponseEntity<byte[]>` 来完成这一操作的例子[^4]:
```java
@GetMapping("/download/{fileName}")
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName){
Path path = Paths.get(UPLOAD_DIR).resolve(fileName).normalize();
Resource resource;
try{
resource = new UrlResource(path.toUri());
if(resource.exists() || resource.isReadable()){
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + resource.getFilename() +"\"")
.body(resource);
}else{
throw new RuntimeException("Could not read the file!");
}
}catch(MalformedURLException e){
throw new RuntimeException("Error: " + e.getMessage());
}
}
```
此方法会读取位于特定路径下的文件,并将其封装成 HTTP 响应发送给调用者。注意设置合适的响应头以便浏览器能正确解析该附件。
阅读全文