图像上传到AWS S3会立即从其他区域上传,但如果与存储区位于同一区域则会成功

时间:2018-03-22 12:32:18

标签: ios swift amazon-s3 aws-sdk

我正在将图像直接上传到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 SDK详细信息:

AWSCore(版本:2.6.13)

AWSS3(版本:2.6.13)

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

还有一点需要注意,重要的是,一旦启动,上传就会立即失败。没有超时或任何问题。

我也可能错过了一些设置。

提前致谢!

2 个答案:

答案 0 :(得分: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上传图片,这可能对您有所帮助。

答案 1 :(得分:0)

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

  

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

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