c# - Amazon S3 MultiPartUpload C# 不工作
问题描述
我已经为这个问题苦苦挣扎了几个小时,希望你能帮助我。不知何故,我的编译器只接受 InitiateMultipartUploadAsync 而不是常规的 InitiateMultipartUpload 并且绝对需要回调作为编译参数,但我可以弄清楚给他什么回调函数。
private static async Task UploadObjectAsync()
{
// Create list to store upload part responses.
List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
// Setup information required to initiate the multipart upload.
InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
{
BucketName = "XXXXXXXXX",
Key = "videos/multipart"
};
// Initiate the upload.
InitiateMultipartUploadResponse initResponse =
await S3Client.InitiateMultipartUploadAsync(initiateRequest);
// Upload parts.
long contentLength = new FileInfo("videotest").Length;
long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB
try
{
Console.WriteLine("Uploading parts");
long filePosition = 0;
for (int i = 1; filePosition < contentLength; i++)
{
UploadPartRequest uploadRequest = new UploadPartRequest
{
BucketName = "XXXXXXXX",
Key = "videos/multipart",
UploadId = initResponse.UploadId,
PartNumber = i,
PartSize = partSize,
FilePosition = filePosition,
FilePath = "videotest"
};
// Track upload progress.
uploadRequest.StreamTransferProgress +=
new EventHandler<StreamTransferProgressArgs>(UploadPartProgressEventCallback);
// Upload a part and add the response to our list.
uploadResponses.Add(await S3Client.UploadPartAsync(uploadRequest));
filePosition += partSize;
}
// Setup to complete the upload.
CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
{
BucketName = "XXXXXXXXXXX",
Key = "videos/multipart",
UploadId = initResponse.UploadId
};
completeRequest.AddPartETags(uploadResponses);
// Complete the upload.
CompleteMultipartUploadResponse completeUploadResponse =
await S3Client.CompleteMultipartUploadAsync(completeRequest);
}
catch (Exception exception)
{
Console.WriteLine("An AmazonS3Exception was thrown: {0}", exception.Message);
// Abort the upload.
AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
{
BucketName = "XXXXXXXXX",
Key = "videos/multipart",
UploadId = initResponse.UploadId
};
await S3Client.AbortMultipartUploadAsync(abortMPURequest);
}
}
public static void UploadPartProgressEventCallback(object sender, StreamTransferProgressArgs e)
{
// Process event.
Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
}
这段代码的灵感来自官方的 aws 示例:https ://docs.aws.amazon.com/AmazonS3/latest/dev/LLuploadFileDotNet.html 所以我真的不明白为什么这不起作用!目前使用上面的代码,Visual Studio 告诉我 InitiateMultipartUploadAsync、UploadPartAsync、CompleteMultipartUploadAsync 和 AbortMultipartUploadAsync 都需要回调函数,但是 1)示例说回调是可选的 2)我尝试的每个回调都不起作用。提前致谢
解决方案
你可以像这样启动它:
s3Client = new AmazonS3Client(BUCKETREGION);
var initiateRequest = new InitiateMultipartUploadRequest { BucketName = BUCKET, Key = KEY };
await s3Client.InitiateMultipartUploadAsync(initiateRequest).ContinueWith(response =>
{
if (!string.IsNullOrEmpty(response.Result.UploadId))
{
uploadId = response.Result.UploadId;
}
else
{
Debug.WriteLine(response.Exception);
}
});
推荐阅读
- maven - 如何在 OSGI 包中嵌入外部 jar 依赖项?
- ruby-on-rails - 在 rails 上使用 postman ruby 为 current_user 创建记录
- angular - 如何在 Angular Ngrx 中管理即将到来的假期?
- javascript - 如何在uiwebview iOS目标c中从服务器打开html代码
- c - Firebase 如何从 ESP32/Arduino 获取数据
- java - 如何在 for 循环中添加 JButton?
- java - 如何在正则表达式中创建多个组?
- python - 始终从 yahoo Finance 检索 cookie 和 crumb 以下载历史数据
- python - 将 pandas 列值更改为另一种格式
- python - OneVsRestClassifier 和 predict_proba