使用 HttpPut 方法在 pre-signed URL 上传文件包含多余的不必要部分

Upload file at pre-signed URL using HttpPut method contains extra unnecessary part

我有 pre-signed 个 URL。我的任务是在 pre-signed URL 上传一个 CSV 文件。我写了下面的代码

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.HttpClients;
import java.io.IOException;
import java.io.File;
public class Test {
    /**
     * Uploading file at pre-signed URL
     *
     * @throws IOException
     */
    private void uploadFileToAWSS3(String preSignedUrl) throws IOException {
        File file = new File("/Users/vmagadum/temp/test.csv");
        HttpClient httpClient = HttpClients.custom()
                .setDefaultRequestConfig(
                        RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build()
                ).build();
        HttpPut put = new HttpPut(preSignedUrl);
        HttpEntity entity = MultipartEntityBuilder.create()
                .addPart("file", new FileBody(file))
                .build();
        put.setEntity(entity);
        put.setHeader("Content-Type","text/csv");

        HttpResponse response = httpClient.execute(put);

        if (response.getStatusLine().getStatusCode() == 200) {
            System.out.println("File uploaded successfully at destination.");
        } else {
            System.out.println("Error occurred while uploading file.");
        }
    }
}

使用上面的代码,我可以将文件上传到目的地,但是当我下载该文件时,我发现还添加了一个不必要的部分。

我要上传的文件结构

我从S3下载后得到的文件

如何忽略添加到文件中的额外 header 部分?

使用下面的代码解决了这个问题

private void uploadFileToAWSS3() throws IOException {
        File file = new File("/Users/vmagadum/SitCopiedFile/temp/details.csv");
        HttpClient httpClient = HttpClients.custom()
                .setDefaultRequestConfig(
                        RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build()
                ).build();
        HttpPut put = new HttpPut(PRE_SIGNED_URL);
        HttpEntity entity = EntityBuilder.create()
                .setFile(file)
                .build();
        put.setEntity(entity);
        put.setHeader("Content-Type","text/csv");

        HttpResponse response = httpClient.execute(put);

        if (response.getStatusLine().getStatusCode() == 200) {
            System.out.println("File uploaded successfully at destination.");
        } else {
            System.out.println("Error occurred while uploading file.");
        }
    }

调查结果:

如果您将文件添加为 multipart/form-data,则 HTTP 请求正文将创建分隔符以容纳多个文件 -

content-Disposition: form-data; name="file1"....
<file1_data>
--BMnE0Tk<delimiter--
content-Disposition: form-data; name="file2"....
<file2_data>
--BMnE0Tk<delimiter--

然后AWS会把这个请求payload当作一个文件来保存。 相反,我们应该从代码中删除 multi-part/form-data 并创建仅将正文作为文件的 HTTP 请求。