从亚马逊S3下载文件时出现错误。

6
我正在尝试从Amazon S3下载文件。我正在使用.NET SDK进行操作。我已经编写了以下代码:
GetObjectRequest request = new GetObjectRequest()
    .WithKey("abc/xyz.jpg")
    .WithBucketName(appConfig);

using (GetObjectResponse response = s3Client.GetObject(request))
{
    int numBytesToRead = (int)response.ContentLength;
    if (numBytesToRead > 0)
    {
        int numBytesRead = 0;
        byte[] buffer = new byte32768;
        using (FileStream fstream = new FileStream(@"C:\abc\xyz.jpg", FileMode.Create))
        {
            using (Stream responseStream = response.ResponseStream)
            {
                do
                {
                    numBytesRead = responseStream.Read(buffer, 0, buffer.Length);
                    fstream.Write(buffer, 0, numBytesRead);
                }
                while (numBytesRead > 0);
            }
        }
    }
}

使用这段代码,我能够下载文件。但现在我想要下载多个文件。为此,我首先列出了所有可用于S3存储的文件,并将其存储在ArrayList中,然后对每个文件调用我的下载函数。

运行list file方法后,当我在使用(GetObjectResponse response = s3Client.GetObject(request))后调用下载函数时,我会收到异常。

{"Access Denied"}

Stack trace:
at Amazon.S3.AmazonS3Client.processRequestError(String actionName, HttpWebRequest request, WebException we, HttpWebResponse errorResponse, String requestAddr, WebHeaderCollection& respHdrs, Type t, Exception& cause)
at Amazon.S3.AmazonS3Client.handleHttpWebErrorResponse(S3Request userRequest, WebException we, HttpWebRequest request, HttpWebResponse httpResponse, Exception& cause, HttpStatusCode& statusCode)
at Amazon.S3.AmazonS3Client.getResponseCallback[T](IAsyncResult result)
at Amazon.S3.AmazonS3Client.endOperation[T](IAsyncResult result)
at Amazon.S3.AmazonS3Client.EndGetObject(IAsyncResult asyncResult)
at Amazon.S3.AmazonS3Client.GetObject(GetObjectRequest request)
at ScreenshotsUploader.ScreenshotsUploader.downloadFile(AmazonS3 s3Client, NameValueCollection appConfig) in c:\Users\xyz\Documents\Visual Studio 2012\Projects\ScreenshotsUploader\ScreenshotsUploader\ScreenshotsUploader.cs:line 220
at ScreenshotsUploader.ScreenshotsUploader.GetServiceOutput() in c:\Users\xyz\Documents\Visual Studio 2012\Projects\ScreenshotsUploader\ScreenshotsUploader\ScreenshotsUploader.cs:line 55

状态码:

System.Net.HttpStatusCode.Forbidden

我需要怎么做才能解决这个问题?

我已经尝试了不同的方法下载文件,但是仍然遇到相同的错误:

第二种方法:

string fileToDownload = @"xyzjpg";
string saveToo = @"C:\xyz.jpg";
TransferUtilityDownloadRequest request = new TransferUtilityDownloadRequest().WithBucketName(appConfig).WithKey(fileToDownload).WithFilePath(saveToo);
TransferUtility tu = new TransferUtility(s3Client);
tu.Download(request);

提前致谢。


1
你能包含你的存储桶策略吗?你的 IAM 在存储桶上有哪些权限? - Greg
这似乎可能是一个权限问题。如果不是的话,您能否发布您的实际代码?我只看到用于文件名、对象键等的字符串常量。 - Edwin
我在权限和策略方面什么也没有变更(添加/编辑)。我只是创建了存储桶并上传了文件到存储桶中。 - Sahil
在这两种方法中,我能够下载单个文件。是否有其他方法可以下载所有文件? - Sahil
在实例化 S3Client 时,您需要指定 AWS 凭证。也许是因为重用该对象导致了此问题。请尝试一下,看看如果在遍历 arraylist 的每个迭代中创建并传递一个新的 S3Client 到您的单文件下载函数中会发生什么。 - Harshal Waghmare
谢谢Harshal的建议。它起作用了。我没有为每次迭代创建S3client,而是在我的downloadFile方法开始时创建了一个新的s3client,这样就可以工作了。 - Sahil
1个回答

5
public Stream DownloadS3Object(string awsBucketName, string keyName)
{

    using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client())
    {
        Stream imageStream = new MemoryStream();
        GetObjectRequest request = new GetObjectRequest { BucketName = awsBucketName, Key = keyName };
        using (GetObjectResponse response = client.GetObject(request))
        {
            response.ResponseStream.CopyTo(imageStream);
        }
        imageStream.Position = 0;
        // Clean up temporary file.
        // System.IO.File.Delete(dest);
        return imageStream;
    }
}

通过函数获取流路径中的值,并使用以下方法将其保存到文件夹中。

SaveStreamToFile(foldername + "/", MainStreamAwsPath);

然后,您可以应用简单的 C# 代码来下载该文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接