Amazon s3 如何使用C#AWS SDK从S3一次下载多个文件
如何从s3存储桶下载多个文件。我找不到比这更好的选择了。 这是我的单文件下载代码。给定URL列表,我循环下载多个文件Amazon s3 如何使用C#AWS SDK从S3一次下载多个文件,amazon-s3,aws-sdk,aws-sdk-net,awss3transferutility,Amazon S3,Aws Sdk,Aws Sdk Net,Awss3transferutility,如何从s3存储桶下载多个文件。我找不到比这更好的选择了。 这是我的单文件下载代码。给定URL列表,我循环下载多个文件 public async Task Download(string url, Stream output) { var s3Uri = new AmazonS3Uri(url); GetObjectRequest getObjectRequest = new GetObjectRequest {
public async Task Download(string url, Stream output)
{
var s3Uri = new AmazonS3Uri(url);
GetObjectRequest getObjectRequest = new GetObjectRequest
{
BucketName = s3Uri.Bucket,
Key = System.Net.WebUtility.UrlDecode(s3Uri.Key)
};
using (var s3Client = new AmazonS3Client(s3Uri.Region))
{
// dispose the underline stream when writing to stream is done
using (var getObjectResponse = await s3Client.GetObjectAsync(getObjectRequest).ConfigureAwait(false))
{
using (var responseStream = getObjectResponse.ResponseStream)
{
await responseStream.CopyToAsync(output);
}
}
}
output.Seek(0L, SeekOrigin.Begin);
}
下载给定S3URL的文件
var list = new List<Stream>();
foreach(var url in urls)
{
var stream = new MemoryStream();
await Download(url,ms);
list.Add(stream);
}
var list=newlist();
foreach(url中的变量url)
{
var stream=newmemoryStream();
等待下载(url,ms);
列表。添加(流);
}
有没有更好的办法从S3一次下载多个文件?我最终决定实现自己的版本
public class StreamWrapper
{
public string Url { get; set; }
public Stream Content { get; set; }
public string FileName { get; set; }
}
public async Task Download(IList<StreamWrapper> inout, int maxConcurrentDownloads)
{
if (maxConcurrentDownloads <= 0)
{
maxConcurrentDownloads = 20;
}
if (!inout.HasAny())
return;
var tasks = new List<Task>();
for (int i = 0; i < inout.Count; i++)
{
StreamWrapper wrapper = inout[i];
AmazonS3Uri s3Uri = null;
if (AmazonS3Uri.TryParseAmazonS3Uri(wrapper.Url, out s3Uri))
{
tasks.Add(GetObject(s3Uri, wrapper.Content));
}
if (tasks.Count == maxConcurrentDownloads || i == inout.Count - 1)
{
await Task.WhenAll(tasks);
tasks.Clear();
}
}
}
private async Task GetObject(AmazonS3Uri s3Uri, Stream output)
{
GetObjectRequest getObjectRequest = new GetObjectRequest
{
BucketName = s3Uri.Bucket,
Key = System.Net.WebUtility.UrlDecode(s3Uri.Key)
};
using (var s3Client = new AmazonS3Client(s3Uri.Region))
{
// dispose the underline stream when writing to local file system is done
using (var getObjectResponse = await s3Client.GetObjectAsync(getObjectRequest).ConfigureAwait(false))
{
using (var responseStream = getObjectResponse.ResponseStream)
{
await responseStream.CopyToAsync(output);
}
}
}
output.Seek(0L, SeekOrigin.Begin);
}
公共类StreamWrapper
{
公共字符串Url{get;set;}
公共流内容{get;set;}
公共字符串文件名{get;set;}
}
公共异步任务下载(IList inout、int maxConcurrentDownloads)
{
如果(maxConcurrentDownloads