如何在Quarkus RestClient中使用FileUpload上传文件至外部REST服务?
完全没必要自己实现接口或者碰非公开的DefaultFileUpload,Resteasy Reactive提供了官方支持的方式来发送多部分请求到外部服务,给你两个最常用的简便方案:
方案一:用MultipartFormDataOutput手动构建请求
直接借助org.jboss.resteasy.reactive.client.MultipartFormDataOutput来组装多部分表单数据,这是官方公开的API,兼容性拉满。
示例代码:
import org.jboss.resteasy.reactive.multipart.FileUpload; import org.jboss.resteasy.reactive.client.MultipartFormDataOutput; import jakarta.ws.rs.client.Client; import jakarta.ws.rs.client.ClientBuilder; import jakarta.ws.rs.core.MediaType; public void sendFileToExternalService(FileUpload uploadedFile) { Client client = ClientBuilder.newClient(); try { MultipartFormDataOutput formData = new MultipartFormDataOutput(); // 添加文件部分,指定文件名、媒体类型和文件对象 formData.addFormData("file", uploadedFile.uploadedFile().toFile(), MediaType.valueOf(uploadedFile.contentType()), uploadedFile.fileName()); // 发送POST请求到外部服务 client.target("https://external-service.com/upload") .request(MediaType.MULTIPART_FORM_DATA_TYPE) .post(javax.ws.rs.client.Entity.entity(formData, MediaType.MULTIPART_FORM_DATA_TYPE)); } finally { client.close(); } }
如果你的文件是生成的(不是前端上传的FileUpload实例),可以直接用InputStream或者本地File对象替换uploadedFile.uploadedFile().toFile(),手动指定对应的文件名和媒体类型即可。
方案二:用Quarkus RestClient简化调用(Quarkus环境专属)
如果是在Quarkus框架下开发,用@RestClient配合@Multipart注解会更简洁,不需要手动构建表单:
- 定义RestClient接口:
import org.jboss.resteasy.reactive.multipart.FileUpload; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; import org.jboss.resteasy.reactive.RestForm; @RegisterRestClient(baseUri = "https://external-service.com") public interface FileUploadClient { @POST @Path("/upload") @jakarta.ws.rs.Consumes(MediaType.MULTIPART_FORM_DATA) void uploadFile(@RestForm("file") FileUpload file); // 如果是生成的文件,也可以用InputStream组合参数: // void uploadFile(@RestForm("file") InputStream fileStream, // @RestForm("filename") String fileName, // @RestForm("content-type") String contentType); }
- 注入并调用:
import jakarta.inject.Inject; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.jboss.resteasy.reactive.multipart.FileUpload; public class FileService { @Inject @RestClient FileUploadClient uploadClient; public void sendFile(FileUpload uploadedFile) { uploadClient.uploadFile(uploadedFile); } }
关键提醒
别碰DefaultFileUpload这类内部实现类,后续版本迭代中随时可能变动,会导致代码兼容性问题。用上面两种基于公开API的方式,既安全又简便。
内容的提问来源于stack exchange,提问作者Cristiano
相关产品推荐
相关产品推荐

