You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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注解会更简洁,不需要手动构建表单:

  1. 定义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);
}
  1. 注入并调用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:52:08