1

AWS SDK for .NET 1.5.9.0を使用していますが、

var putObjectRequest = new PutObjectRequest
{
    BucketName = bucketName,
    Key = key,
    FilePath = filePath,
    CannedACL = S3CannedACL.PublicRead
};
try
{
    using (var pubtObjectResponse = client.PutObject(putObjectRequest))
    {
        Logger.Application.DebugFormat("uploaded {0} to {1} on bucket {2}, got id {3}", filePath, remotePath, bucketName, pubtObjectResponse.AmazonId2);
    }
}
catch (Exception ex)
{
    Logger.Application.Fatal(string.Format("could not upload {0} to {1} on bucket {2}", filePath, remotePath, bucketName), ex);
}

のため

System.Net.WebException: 要求は中止されました: 要求はキャンセルされました。--->
System.IO.IOException: すべてのバイトが書き込まれるまでストリームを閉じることができません。
System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
--- 内部例外スタック トレースの終わり ---
System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)
at System.Net.ConnectStream.System .Net.ICloseEx.CloseEx(CloseExState closeState)
で System.Net.ConnectStream.Dispose(Boolean disposing)
で System.IO.Stream.Close()
で Amazon.S3.AmazonS3Client.getRequestStreamCallback[T](IAsyncResult result)
で Amazon. S3.AmazonS3Client.endOperation[T](IAsyncResult結果)
Amazon.S3.AmazonS3Client.EndPutObject (IAsyncResult asyncResult) で

への提案によって

var transferUtilityUploadRequest = new TransferUtilityUploadRequest()
    .WithBucketName(bucketName)
    .WithKey(key)
    .WithFilePath(filePath)
    .WithCannedACL(S3CannedACL.PublicRead);
try
{
    transferUtility.Upload(transferUtilityUploadRequest);

    // how do I get success-state in here?
    // how do I get AmazonId2 in here?
}
catch (Exception ex)
{
    Logger.Application.Fatal(string.Format("could not upload {0} to {1} on bucket {2}", filePath, remotePath, bucketName), ex);
}

私がやろうとしていることは明らかですが、必要な情報にアクセスするにはどうすればよいでしょうか? 誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

3

TransferUtility の使用中は、ユーティリティがすべての応答を破棄するため、AmazonId2 にアクセスできません。

TransferUtility.Upload はブロッキング操作であるため、リクエストが完了するまで返されません。ただし、次のように、リクエストのイベントにサブスクライブすることで、アップロードを監視できます。

uploadRequest.UploadProgressEvent += (source, progress) =>
{
    Console.WriteLine("{0}% - {1} / {2}",
        progress.PercentDone,
        progress.TransferredBytes,
        progress.TotalBytes);
};
于 2012-11-28T23:47:06.877 に答える