我正在将图像直接上传到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
还有一点需要注意,重要的是,一旦启动,上传就会立即失败。没有超时或任何问题。
我也可能错过了一些设置。
提前致谢!
答案 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工具在各个地区拥有相同的内容