簡體   English   中英

Quarkus rest-client 多部分文件上傳

[英]Quarkus rest-client multipart file upload

以下是 curl 服務

服務 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);
    }
}

Maven 依賴關系

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM