AWS C ++ SDKアップロードパートアウト -- c++ フィールド と amazon-web-services フィールド と amazon-s3 フィールド と aws-sdk フィールド 関連 問題

AWS C++ SDK UploadPart times out












2
vote

問題

日本語

AWS C ++ SDKを使用してAmazon S3にファイルをアップロードしようとしています。

createMultiPartUploadへの呼び出しは正常に戻りますが、次のエラーでアップロードパートがタイムアウトして次のように呼び出します。

<事前> <コード> (Aws::String) m_message = "Unable to parse ExceptionName: RequestTimeout Message: Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed."

呼び出しを開始するのかを理解していませんが、パートアップロード通話はありません。明らかにネットワークの問題はありません。

これは私のコードです:

<事前> <コード> bool FileUploader::uploadChunk() { Aws::S3::Model::UploadPartRequest request; request.SetBucket("video"); request.SetKey(_key); request.SetUploadId(_file->uploadId); request.SetPartNumber(_file->chunksUploaded + 1); long file_pos = _file->chunksUploaded * CHUNK_SIZE; _input_file.seekg(file_pos, std::ios::beg); _input_file.read(_file_buf, CHUNK_SIZE); long n_bytes = _input_file.gcount(); if(n_bytes > 0) { request.SetContentLength(n_bytes); char_array_buffer buf2(_file_buf, _file_buf + n_bytes); std::iostream *chunk_stream = new std::iostream(&buf2); request.SetBody(std::shared_ptr<std::iostream>(chunk_stream)); Aws::S3::Model::UploadPartOutcome response = _client->UploadPart(request); if(response.IsSuccess()) { _file->chunksUploaded++; _uploader->updateUploadStatus(_file); } return response.IsSuccess(); } else { return false; } }
英語

I am try to upload a file to Amazon S3 using the AWS C++ SDK.

The call to CreateMultipartUpload returns successfully but the following call to UploadPart times out with the following error:

(Aws::String) m_message = "Unable to parse ExceptionName: RequestTimeout Message: Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed." 

I don't understand why the initiate call works but not the part upload call. There clearly isn't any network issue.

This is my code:

bool FileUploader::uploadChunk() {      Aws::S3::Model::UploadPartRequest request;     request.SetBucket("video");     request.SetKey(_key);     request.SetUploadId(_file->uploadId);     request.SetPartNumber(_file->chunksUploaded + 1);      long file_pos = _file->chunksUploaded * CHUNK_SIZE;     _input_file.seekg(file_pos, std::ios::beg);      _input_file.read(_file_buf, CHUNK_SIZE);     long n_bytes = _input_file.gcount();      if(n_bytes > 0) {          request.SetContentLength(n_bytes);          char_array_buffer buf2(_file_buf, _file_buf + n_bytes);         std::iostream *chunk_stream = new std::iostream(&buf2);          request.SetBody(std::shared_ptr<std::iostream>(chunk_stream));          Aws::S3::Model::UploadPartOutcome response = _client->UploadPart(request);         if(response.IsSuccess()) {             _file->chunksUploaded++;             _uploader->updateUploadStatus(_file);         }          return response.IsSuccess();      }     else {         return false;     }  } 
</div
           
 
 

回答リスト

3
 
vote

問題は、セットボディのためのストリームを取得する方法でした。私はHomeGrownアプローチの代わりにブーストライブラリの使用に切り替えました。

<事前> <コード> typedef boost::iostreams::basic_array_source<char> Device; boost::iostreams::stream_buffer<Device> stmbuf(_file_buf, n_bytes); std::iostream *stm = new std::iostream(&stmbuf); request.SetBody(std::shared_ptr<Aws::IOStream>(stm));

これはうまく機能します。

私は、CompleteMultiPartuploadへの呼び出しのためにアップロードしていた部分を追跡する必要がありました。

<事前> <コード> Aws::S3::Model::CompletedPart part; part.SetPartNumber(request.GetPartNumber()); part.SetETag(response.GetResult().GetETag()); _uploadedParts.AddParts(part);
 

The problem was my method of obtaining a stream for SetBody. I switched to using the boost library instead of a homegrown approach.

    typedef boost::iostreams::basic_array_source<char> Device;     boost::iostreams::stream_buffer<Device> stmbuf(_file_buf, n_bytes);      std::iostream *stm = new std::iostream(&stmbuf);      request.SetBody(std::shared_ptr<Aws::IOStream>(stm)); 

This works well.

I also needed to keep track of the parts I was uploading for the call to CompleteMultipartUpload as follows:

    Aws::S3::Model::CompletedPart part;     part.SetPartNumber(request.GetPartNumber());     part.SetETag(response.GetResult().GetETag());     _uploadedParts.AddParts(part); 
</div
 
 
1
 
vote

あるいは、これを行うTransferManagerインタフェースを使用することもできます。それはiOStreamインターフェースを持っています。さらに、iOStreamのための事前割り当てバッファ実装を提供します。

https://github.com/aws/aws-sdk-cpp/blob/master/aws-cpp-sdk-core/include/aws/core/utils/Stream/PrealLocatedStreamBuf.h

 

Alternatively, you can use the TransferManager interface which will do this for you. It has an IOStream interface. In addition we provide a preallocated buffer implementation for iostream:

https://github.com/aws/aws-sdk-cpp/blob/master/aws-cpp-sdk-core/include/aws/core/utils/stream/PreallocatedStreamBuf.h

</div
 
 

関連する質問

1  リンクを使用したAmazon Cognito確認の問題  ( Amazon cognito confirmation issue using link ) 
私はすでにリンクを使ってAmazon Signup検証を実装していましたが、それはうまく機能していましたが、突然、私はその検証リンクを使い、ある程度のエラーを表示していない添付のスクリーンショットを参照してください。 ...

13  AWS SMSの配送ステータスを取得する  ( Getting delivery status of aws sms ) 
ノードSDKを通してAWSからSMSを送信しています。 SMSはうまく出かけています、そして私は配達情報を取得しようとしています。明らかにそれはそれほど簡単で、CloudWatchにログを送信し、CloudWatchを送信するためにSNSをセットアップし、Me...

0  Amazon SNS - AWS-SDK-PHP  ( Amazon sns aws sdk php ) 
<コード> $accessKey = 'XZA...'; $accessSecret = 'YKW...'; $credentials = new AwsCredentialsCredentials($accessKey, $a...

0  AWS SDKリンカフラグは輸入プロジェクトと競合しています  ( Aws sdk linker flags conflicting with imported project ) 
AWS SDKフレームワークを使用してアプリを正常に持っています。今、私は静的ライブラリを自家製フレームワークとしてインポートし、他のプロジェクトのいくつかを共有しています。 問題は次のとおりです。静的ライブラリをインポートするために、i を追加する必要が...

1  APIはNodeJSとDynamoDBを使用して動作を停止します  ( Api stop working using nodejs and dynamodb ) 
AWS DynamoDBを使用してNodeJSベースのAPIに取り組んでいます。 APIは元気で働いていましたが、今日はこのエラーを得ています: <事前> <コード> { "success": false, "message": { ...

63  Amazons3Client(認証情報)は非推奨です  ( Amazons3clientcredentials is deprecated ) 
問題は問題を説明するので、Amazon S3で利用可能なファイルを読みようとしています。廃止予定のコンストラクターの代替通話を見つけることができませんでした。 これはコードです: <事前> <コード> private String AccessKeyID = ...

0  Resource URLを使用したAWS S3リソースの削除 - Java SDK  ( Deleting aws s3 resource with resource url java sdk ) 
URLでJava SDKを使用してAWS S3からリソースを削除する方法はありますか? 私はあなたがこのようなバケット名とkeynameを使ってリソースを削除できることを知っています: <事前> <コード> s3client.deleteObject(new...

1  SQSの表示タイムアウトは、その特定のメッセージの代わりにキュー全体をロックします。  ( Sqs visibility timeout locks out the entire queue instead of just that particul ) 
私はSQSで実験をしています。私の理解から、視認性タイムアウトは、その可視性タイムアウトの長さについて他のコンシューマにメッセージを利用できなくなります。しかし、私の経験から、これはそうではないようです。視認性タイムアウトは、そのキュー内の all メッセージ...

0  Secrets Manager-Sypressからの秘密を取得するために、ブラウザ内の認証情報ファイルからAWS認証情報情報にアクセスする方法  ( How to access aws credentials info from credentials file within the browser to r ) 
私のローカルのWindowsマシンにAWS認証情報ファイルと設定ファイルを持っています。 JavaScriptコードの下で、私はusernameとpasswordを含むAWS Secret Managerから秘密を取得できます。 、私はそれを得るために私のAW...

0  ElasticBeanStalk環境を更新できません  ( Cannot update elasticbeanstalk environment ) 
<コード> div1 <コード> div1 <コード> のEC2INSTANCEから使用していますが、次のエラーを取得しています。 <事前> <コード> div3 私のIAMの役割にはS3にアクセスできません.Create Bucket。しかし、なぜバケ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有