c++上传文件的一部分到AWS S3



我想在AWS中从单个本地文件创建多个文件,而不实际将文件数据读入缓冲区。每个文件有:

  • 目的地名称(在AWS中)
  • 偏移量(本地文件起始点)
  • size(从偏移量到上传的字节数)

例如:
本地文件大小为1MB。文件1:"name1", offset = 0字节,size = 100字节。File2: "name2", offset = 200 bytes, size = 500 bytes .

文件1应作为独立文件上传,其数据将为0 - 100字节的本地文件。文件2应作为第二个独立文件上传,其数据将为200 - 700字节的本地文件。

我使用本地Minio服务器作为对象存储服务器。我的代码成功上传了一个完整的本地文件内容:

PutObjectRequest request;
request.WithBucket("my_bucket_name").WithKey("file_path_in_aws");
std::shared_ptr<Aws::IOStream> fileData = Aws::MakeShared<Aws::FStream>("some_alloc_tag", 
"path_file_to_file_to_upload", std::ios_base::in | std::ios_base::binary);
request.SetBody(fileData);        
PutObjectOutcome outcome = m_pS3Client->PutObject(request);
if (outcome.IsSuccess() == false)
//print error message
std::cout << outcome.GetError().GetMessage().c_str() 

我尝试通过将本地文件读取到缓冲区中,然后使用Aws::StringStream将缓冲区的每个部分作为独立文件上传。

但是我需要上传本地文件作为多个文件而不读取数据所以我试了:

std::shared_ptr<Aws::IOStream> fileData = Aws::MakeShared<Aws::FStream>("some_alloc_tag", 
"path_file_to_file_to_upload", std::ios_base::in | std::ios_base::binary);
request.SetBody(data);
request.SetContentLength(size1);
data->seekg(offset1, std::ios_base::beg);

调用Aws::S3::S3Client::PutObject失败。失败消息为:"发送http请求时遇到网络错误">

Minio服务器打印错误信息:

Error: read tcp 127.0.0.1:9000->127.0.0.1:49811: wsarecv: An existing connection was forcibly closed by the remote host. (*net.OpError)
5: cmdfs-v1-helpers.go:323:cmd.fsCreateFile()
4: cmdfs-v1.go:1173:cmd.(*FSObjects).putObject()
3: cmdfs-v1.go:1089:cmd.(*FSObjects).PutObject()
2: cmdobject-handlers.go:1631:cmd.objectAPIHandlers.PutObjectHandler()
1: nethttpserver.go:2069:http.HandlerFunc.ServeHTTP()

当我删除内容长度变化和seekg:

request.SetContentLength(size1);
data->seekg(offset1, std::ios_base::beg);

然后上传所有作品和完整文件。

我发现在aws-sdk-cpp github中有"UploadPartRequest"存在。我不确定这是否需要在我的场景。只是找不到一个合适的例子来说明如何使用这个"UploadPartRequest"或者目的是什么。

是否有人成功上传了本地文件的一部分(给定偏移量和长度),而不读取文件内容,只是使用Aws::FStream(并更改文件位置'seekg') ?还是用别的方式?

我很确定UploadPartRequest用于多部分上传-通常在传输管理器中-其中文件被分割成较小的块(称为部分)并上传到S3,原始文件从所述部分重建。我认为它在这种情况下是没有用的。

用户指南中的一些文档(在这里)表明您可以传递lambda函数来完成任务。

相关内容

  • 没有找到相关文章

最新更新