【问题标题】:Image upload to AWS S3 fails instantly from a different region but succeeds if in the same region as the bucket从不同区域将图像上传到 AWS S3 会立即失败,但如果与存储桶位于同一区域则成功
【发布时间】:2018-08-31 21:33:21
【问题描述】:

我正在将图像直接上传到 AWS 存储桶,该存储桶在我的位置(印度)运行良好。当用户位置是新加坡时,相同的代码无法上传图像。

以下是我用来上传图片的方法。

func uploadMediaOnS3(contentType: String = "application/octet-stream", mediaData: Data, folderName: String, fileName: String, progressBlock:@escaping (_ uploadProgress: Float, _ uploadStatus: Bool) -> Void) {

    //Configure Credentials
    let credentialProvider = AWSStaticCredentialsProvider(accessKey: "my-access-key", secretKey: "my-secret-key")
    let configuration = AWSServiceConfiguration(region: .APSouth1, credentialsProvider: credentialProvider)
    AWSServiceManager.default().defaultServiceConfiguration = configuration
    AWSServiceManager.default().defaultServiceConfiguration.timeoutIntervalForRequest = 90.0
    AWSServiceManager.default().defaultServiceConfiguration.timeoutIntervalForResource = 90.0
    //Setup Progress Block
    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = {(task, progress) in
        DispatchQueue.main.async {
            print(" ==> \(Float(progress.fractionCompleted * 100))")
            progressBlock(Float(progress.fractionCompleted * 100), false)
        }
    }

    //Setup Completion Block
    let uploadCompletionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock = { (task, error) -> Void in
        DispatchQueue.main.async {
            if error != nil {
                progressBlock(-1.0, false)
            } else {
                progressBlock(100.0, true)
            }
        }
    }

    //Upload Data
    let transferUtility = AWSS3TransferUtility.default()
    transferUtility.uploadData(mediaData, bucket: "my-bucket-name", key: "\(folderName)\(fileName)", contentType: contentType, expression: expression, completionHandler: uploadCompletionHandler).continueWith { (task) -> Any? in
        if task.error != nil {
            progressBlock(-1.0, false)
        }
        return nil
    }
}

以下是我的 AWS 开发工具包详细信息:

AWSCore(版本:2.6.13)

AWSS3(版本:2.6.13)

我的猜测是该地区存在一些问题。我发现我的存储桶位置在 .APSouth1(印度孟买)之​​下并且在这里工作正常,但是在新加坡使用时,由于它在 .APSoutheast1 之下而失败

还有一点需要注意,可能很重要,即上传一开始就会立即失败。没有超时或任何问题。

我也有可能在这里遗漏了一些设置。

提前致谢!

【问题讨论】:

    标签: ios swift amazon-s3 aws-sdk


    【解决方案1】:
    func sendMultiPartAWS(path: String, imgData: Data, onComplete: @escaping (JSON, NSError?, URLResponse?) -> Void, onError: @escaping (NSError?, URLResponse?) -> Void) {
    
            Alamofire.upload(imgData, to: path, method: .put).responseJSON { response in
                if response.response?.statusCode == 200 {
    
                    let swiftyJSON = JSON.init(response.data!)
                    onComplete(swiftyJSON, nil, response.response)
    
                 } else {
                }
             }
        }
    

    我已经使用上述代码在 AWS 中上传图片,希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      存储桶名称是全局的,但位置不是。以下引自Bucket Documentation

      属于您在特定 AWS 区域中创建的存储桶的对象永远不会离开该区域,除非您明确将它们转移到另一个区域。例如,存储在欧盟(爱尔兰)地区的对象永远不会离开它。

      您可以使用cross-region replication 设施在各个地区拥有相同的内容

      【讨论】:

      • 您的解决方案不是关于访问已上传的内容吗?问题是来自不同区域的上传失败。这就是错误 AWSTranferUtilityErrorDomain(code=2)。附言它只是在新加坡失败,在印度或南非成功。 (至少我从这些地方取得了成功。)
      猜你喜欢
      • 2020-09-25
      • 2018-08-05
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多