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
相关产品推荐
相关产品推荐

