![](/img/trans.png)
[英]Upload a file using Restlet multipart/form-data in java
[英]File Upload Using Feign - multipart/form-data
我正在嘗試使用 feign 完成多部分文件上傳,但我似乎無法在任何地方找到一個很好的例子。 我本質上希望 HTTP 請求結果類似於:
...
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="name"
Larry
--AaB03x
Content-Disposition: form-data; name="file"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
甚至...
------fGsKo01aQ1qXn2C
Content-Disposition: form-data; name="file"; filename="file.doc"
Content-Type: application/octet-stream
... binary data ...
------fGsKo01aQ1qXn2C--
我是否需要手動構建請求正文,包括生成多部分邊界? 考慮到這個客戶可以做的所有其他事情,這似乎有點過分。
不,你沒有。 你只需要定義一種代理接口方法,指定content-type為:multipart/form-data以及遠程API需要的參數等其他信息。 下面是一個例子:
public interface FileUploadResource {
@RequestLine("POST /upload")
@Headers("Content-Type: multipart/form-data")
Response uploadFile(@Param("name") String name, @Param("file") File file);
}
完整的示例可以在這里找到: File Uploading with Open Feign
對於 spring boot 2 和spring-cloud-starter-openfeign使用以下代碼:
@PostMapping(value="/upload", consumes = "multipart/form-data" )
QtiPackageBasicInfo upload(@RequestPart("package") MultipartFile package);
您需要在 feign 客戶端調用中將 @RequestParam 更改為 @RequestPart 以使其工作,並將消費添加到@PostMapping。
如果您已經在使用 Spring Web,您可以嘗試我實現的能夠創建 Multipart 請求的 Feign Encoder。 它可以發送單個文件、一組文件以及一個或多個額外的 JSON 有效負載。 這是我的測試項目。 如果不使用Spring,可以通過改變FeignSpringFormEncoder中的encodeRequest方法來重構代碼。
MBozic 解決方案不完整,您還需要為此啟用編碼器:
public class FeignConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder () {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
@FeignClient(name = "file", url = "http://localhost:8080", configuration = FeignConfig.class)
public interface UploadClient {
@PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String fileUpload(@RequestPart(value = "file") MultipartFile file);
}
讓我為最新的 OpenFeign 添加答案:
為 Feign-Form 添加依賴:
io.github.openfeign.form feign-form 3.8.0像這樣將 FormEncoder 添加到您的 Feign.Builder 中:
SomeApi github = Feign.builder() .encoder(new FormEncoder()) .target(SomeApi.class, "http://api.some.org");
@RequestLine("POST /send_photo") @Headers("Content-Type: multipart/form-data") void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);
參考: https ://github.com/OpenFeign/feign-form
使用 feign 客戶端接口從一個服務調用另一個服務以進行文件傳輸/上傳/發送:
@FeignClient(name = "service-name", url = "${service.url}", configuration = FeignTokenForwarderConfiguration.class)
public interface UploadFeignClient {
@PostMapping(value = "upload", headers = "Content-Type= multipart/form-data", consumes = "multipart/form-data")
public void upload(@RequestPart MultipartFile file) throws IOException;
}
**Actual API:**
@RestController
@RequestMapping("upload")
public class UploadController {
@PostMapping(value = "/upload", consumes = { "multipart/form-data" })
public void upload(@RequestParam MultipartFile file) throws IOException {
//implementation
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.