Amazon S3存储桶C#API未捕获错误

时间:2018-07-24 15:01:06

标签: c# amazon-web-services amazon-s3

为(可能是)结构性较差的问题表示歉意,因为这是我第一次在此处发布。

我正在使用Amazon.NET的AWS API将文件保存到存储桶。查看其他示例和文档,我想出了以下方法。该方法成功执行,但是没有文件上传到S3存储桶。我不确定是否有任何错误,但是没有办法检查,因为Upload()是一个void方法,并且不会引发任何异常。

我不确定自己是否提供了正确的信息,或者甚至失败。

是否可以捕获潜在的上传错误或监视上传进度?还是我做错了什么?

    public static void AddItemToStorage(byte[] byteArray, string itemName)
    {
        MemoryStream itemStream = new MemoryStream(byteArray);

        // sign in information
        var credentials = new Amazon.Runtime.BasicAWSCredentials(
            "APIKey",
            "APIPassword"
            );

       // Link to client
       Amazon.S3.AmazonS3Client client = new Amazon.S3.AmazonS3Client(credentials, Amazon.RegionEndpoint.EUCentral1);

        TransferUtility tu = new TransferUtility(client);

        // Actual file is stored in a GUID folder to make sure there are no collisions with file names
        string bucket = "bucket_name_here/" + Guid.NewGuid().ToString(); 
        string item = itemName.Replace(" ", "_");

        itemStream.Seek(0, SeekOrigin.Begin);
        tu.Upload(itemStream, bucket, item);

        // url would be: http://bucket_here/GUID_Folder/itemName.ext/
    }

此致

Zak

1 个答案:

答案 0 :(得分:0)

设法找到一个“解决方案”。我需要配置为使用HTTP,将ACL设置为PublicRead,并使用上载请求来监视上载。这仍然没有用,所以我测试了是否通过请求ACL来上传文件。现在,这使我上传的项目在存储中可见。仍然不知道为什么,但可能会帮助其他陷入困境的人。

    public static void AddItemToStorage(byte[] byteArray, string itemName)
    {
        MemoryStream itemStream = new MemoryStream(byteArray);

        var config = new AmazonS3Config();
        config.UseHttp = true;
        config.RegionEndpoint = Amazon.RegionEndpoint.EUCentral1;

        var credentials = new Amazon.Runtime.BasicAWSCredentials(
            "AWSUserKey",
            "AWSPassword"
            );

        AmazonS3Client client = new AmazonS3Client(credentials, config);
        TransferUtility tu = new TransferUtility(client);

        itemStream.Seek(0, SeekOrigin.Begin);
        TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
        {
            BucketName = "bucket_name_here" + Guid.NewGuid().ToString(),
            Key = itemName.Replace(" ", "_"),
            InputStream = itemStream,
            CannedACL = S3CannedACL.PublicRead                
        };

        request.UploadProgressEvent += Request_UploadProgressEvent;

        tu.UploadAsync(request).Wait();

        var resp = client.GetACL(new GetACLRequest()
        {
            BucketName = request.BucketName,
            Key = request.Key
        });

        itemStream.Dispose();
    }