[英]Quarkus rest-client multipart file upload
以下是 curl 服務
curl --location --request POST 'https://someapi.com/api/v2/tickets' \
--header 'Authorization: Basic sdsdfsdfsdfsdf=' \
--header 'Cookie: _x_w=5_2' \
--form 'attachments[]=@"/home/Downloads/sample.pdf"' \
--form 'email="example@example.com"'
以下設置適用於 Quarkus 2.12.2-Final,但它使用 @PartFileName() 中指定的 static 文件名上傳文件,我的要求是上傳具有動態名稱和內容類型的文件,有人可以指導我關於如何更新它以動態讀取帶有擴展名的文件名?
@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,
@MultipartForm MultipartBody data);
}
public class MultipartBody {
@FormParam("attachments[]")
@PartFilename("sample.pdf")
@PartType(MediaType.APPLICATION_OCTET_STREAM)
public File file;
@FormParam("email")
@PartType(MediaType.TEXT_PLAIN)
public String email = "abcd@bixy.com";
}
public class SampleRepositoryImpl implements SampleRepository {
@Inject
@RestClient
SampleClient client;
@Override
public SampleResponse create(MultipartBody request) {
MultipartBody body = new MultipartBody();
File f = new File("/home/Downloads/sample.pdf");
body.setFile(f);
return client.create(getAuthHeader(), body);
}
}
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-multipart</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
終於找到路了,就在這里
@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,
@MultipartForm MultipartFormDataOutput data);
}
public class SampleRepositoryImpl implements SampleRepository {
@Inject
@RestClient
SampleClient client;
@Override
public void create(SampleData sampleData) {
MultipartFormDataOutput dataOutput = new MultipartFormDataOutput();
dataOutput.addFormData("email", sampleData.getData().getEmail(), MediaType.TEXT_PLAIN_TYPE);
sampleData.getAttachments().forEach(x -> {
dataOutput.addFormData(
"attachments[]",
x.getInputStream(),
MediaType.APPLICATION_OCTET_STREAM_TYPE,
x.getFileName());
});
}
}
public class Attachment {
private InputStream inputStream;
private String fileName;
//getter setter
}
public class SampleData {
private List<Attachment> attachments = new ArrayList<>();
private OtherData data;
public void addAttachment(Attachment attachment) {
if (attachments == null) {
attachments = new ArrayList<>();
}
attachments.add(attachment);
}
// getter setter
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.