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

Quarkus Rest Client实现Multipart文件动态文件名与类型上传

修改方案:实现动态文件名与内容类型

1. 修改SampleClient接口

将参数从MultipartBody替换为MultipartFormDataOutput,完全动态构建多部分表单:

@Path("/v2/tickets")
@RegisterRestClient(configKey = "sampleKey")
public interface SampleClient {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    SampleResponse create(
            @HeaderParam("Authorization") String authorization,
            MultipartFormDataOutput formData);
}

2. 重构Repository实现类

手动构建MultipartFormDataOutput,动态设置文件名、内容类型和文件内容:

public class SampleRepositoryImpl implements SampleRepository {

    @Inject
    @RestClient
    SampleClient client;

    @Override
    public SampleResponse create(File file, String email) {
        MultipartFormDataOutput formData = new MultipartFormDataOutput();
        
        // 添加email字段
        formData.addFormData("email", email, MediaType.TEXT_PLAIN_TYPE);
        
        // 获取文件名和对应的MIME类型
        String fileName = file.getName();
        MediaType mediaType = guessMediaType(fileName);
        
        // 添加文件附件,动态设置文件名和内容类型
        try (InputStream fileInputStream = new FileInputStream(file)) {
            formData.addFormData("attachments[]", fileInputStream, mediaType, fileName);
        } catch (IOException e) {
            throw new RuntimeException("读取文件失败", e);
        }
        
        return client.create(getAuthHeader(), formData);
    }
    
    // 根据文件名后缀猜测MIME类型
    private MediaType guessMediaType(String fileName) {
        String extension = FilenameUtils.getExtension(fileName).toLowerCase();
        switch (extension) {
            case "pdf":
                return MediaType.APPLICATION_PDF_TYPE;
            case "jpg":
            case "jpeg":
                return MediaType.IMAGE_JPEG_TYPE;
            case "png":
                return MediaType.IMAGE_PNG_TYPE;
            // 可根据需求添加更多类型
            default:
                return MediaType.APPLICATION_OCTET_STREAM_TYPE;
        }
    }
}

注:FilenameUtils来自已引入的org.apache.commons.lang3依赖,可直接使用。

3. 移除原MultipartBody类

不再使用@MultipartForm注解的实体类,直接删除原MultipartBody即可。

替代方案:保留MultipartBody实现动态文件名

若不想完全重构,可修改MultipartBody使用EL表达式动态获取文件名:

public class MultipartBody {

    @FormParam("attachments[]")
    @PartFilename("#{this.fileName}")
    @PartType("#{this.mediaType}")
    public InputStream fileInputStream;
    
    public String fileName;
    public MediaType mediaType;
    
    @FormParam("email")
    @PartType(MediaType.TEXT_PLAIN)
    public String email;
}

在Repository中设置对应属性:

@Override
public SampleResponse create(File file, String email) {
    MultipartBody body = new MultipartBody();
    body.email = email;
    body.fileName = file.getName();
    body.mediaType = guessMediaType(file.getName());
    try {
        body.fileInputStream = new FileInputStream(file);
    } catch (IOException e) {
        throw new RuntimeException("读取文件失败", e);
    }
    return client.create(getAuthHeader(), body);
}

该方式依赖RESTEasy的EL表达式支持,Quarkus 2.12.2-Final版本兼容此特性。


内容的提问来源于stack exchange,提问作者manish2aug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:11:29