使用 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 请求。
我有 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 请求。