c# - 如何使用 TransferUtility 上传多个文件

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

我正在尝试理解以下文档:

  • TransferUtility.UploadDirectory

  • 文档没有描述上传的错误情况。通常我会猜测类似 System.Net.Http.HttpRequestException .
    看了多条评论,看来S3确实是not support TransactionScope .似乎唯一支持的是文件级别:
  • Are writes to Amazon S3 atomic (all-or-nothing)?


  • https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#ConsistencyModel

  • 所以我的问题是:
  • 我在哪里可以找到 UploadDirectory 的错误情况?
  • 由于原子操作是在文件(对象)级别,因此使用 UploadDirectory 是否有意义?

  • 我的问题是关于上传多个文件(即 s3 'object'),而不是关于对单个文件进行多部分上传。

    最佳答案

    AFAIK,你在这里能做的最好的事情就是将它包装在一个 try catch 中:

    try
    {
        ...
    }
    catch (AmazonS3Exception e)
    {
        // implement rollback operation
        ...
    }
    catch (Exception e)
    {
        // no possible rollback operation, abort program ?
        ...
    }
    
    您可以使用 UploadDirectoryProgressEvent 跟踪进度.如果发生错误,如果您想清理,您必须比较进度,注意差异,并采取适当的措施(例如,如果您不想将对象保留在 S3 中,并且您希望整个操作是原子的)。
    请特别注意以下事实:
    var request = new TransferUtilityUploadDirectoryRequest
    {
      UploadFilesConcurrently = true,
    };
    
    会对你的回滚机制产生影响。设置 UploadFilesConcurrently真正意味着 UploadDirectoryProgressArgs收到 UploadDirectoryProgressEvent CurrentFile 的值为空:
  • https://github.com/aws/aws-sdk-net/issues/317

  • 在这种情况下,您只能在可以删除完整远程目录的情况下执行回滚。
    另请注意有关分段上传的文档:

    If a multipart upload is interrupted, TransferUtility will attempt to abort the multipart upload. Under certain circumstances (network outage, power failure, etc.), TransferUtility will not be able to abort the multipart upload. In this case, in order to stop getting charged for the storage of uploaded parts, you should manually invoke TransferUtility.AbortMultipartUploads() to abort the incomplete multipart uploads.


    该文档有 tracking 的示例和 aborting多部分上传。
    至于你的另一个问题:

    Does it makes sense to use UploadDirectory since atomic operations are at file (object) level ?


    我会说这取决于。上传整个文件目录的代码可能会更清晰一些,但由于您仍然需要进行跟踪和清理,因此您不妨一个一个地处理文件。

    关于c# - 如何使用 TransferUtility 上传多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68037980/

    相关文章:

    c# - 尝试将 EF 6 与 PostgreSQL 一起使用 - 无法找到或加载已注册的 .Net Framework 数据提供程序

    amazon-web-services - 在VPC中可以在AWS上创建的最小子网是多少?

    node.js - gRPC DEADLINE_EXCEEDED 即使服务器已启动并且

    python - Spectrum S3 访问被拒绝

    c# - 谷歌应用程序中日历条目的时间问题

    c# - 更改电子邮件中自动附加文件的名称

    amazon-web-services - aws cli cloudformation update-stack 设置标签?

    python - Django Boto 和上传到 S3 是一个 400 错误请求

    python - s3 存储桶中的 utf-8 文件名

    c# - configuration.GetValue 列表返回 null