ios - 快速上传图像 AWS S3 存储桶

标签 ios swift amazon-web-services amazon-s3

我正在尝试将图像上传到存储桶 S3 AWS,我正在使用以下代码。但我是用它上传到存储在变量或 imageView.image 中的图像吗?

let ext = "jpg"
    let imageURL = NSBundle.mainBundle().URLForResource("imagename", withExtension: ext)
    print("imageURL:\(imageURL)")

    let uploadRequest = AWSS3TransferManagerUploadRequest()
    uploadRequest.body = imageURL
    uploadRequest.key = NSProcessInfo.processInfo().globallyUniqueString + "." + ext
    uploadRequest.bucket = S3BucketName
    uploadRequest.contentType = "image/" + ext


    let transferManager = AWSS3TransferManager.defaultS3TransferManager()
    transferManager.upload(uploadRequest).continueWithBlock { (task) -> AnyObject! in
        if let error = task.error {
            print("Upload failed ❌ (\(error))")
        }
        if let exception = task.exception {
            print("Upload failed ❌ (\(exception))")
        }
        if task.result != nil {
            let s3URL = NSURL(string: "http://s3.amazonaws.com/\(self.S3BucketName)/\(uploadRequest.key!)")!
            print("Uploaded to:\n\(s3URL)")
        }
        else {
            print("Unexpected empty result.")
        }
        return nil
    }

最佳答案

AWSS3TransferManager 已弃用。请改用 AWSS3TransferUtility

The transfer utility provides methods for both single-part and multipart uploads. When a transfer uses multipart upload, the data is chunked into a number of 5 MB parts which are transferred in parallel for increased speed.

 func uploadFile(withImage image: UIImage) {

    let access = "YOUR ACCESS KEY"
    let secret = "YOUR SECRET KEY"
    let credentials = AWSStaticCredentialsProvider(accessKey: access, secretKey: secret)
    let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentials)

    AWSServiceManager.default().defaultServiceConfiguration = configuration

    let s3BucketName = "YOUR BUCKET NAME"
    let compressedImage = image.resizedImage(newSize: CGSize(width: 80, height: 80))
    let data: Data = compressedImage.pngData()!
    let remoteName = generateRandomStringWithLength(length: 12)+"."+data.format
    print("REMOTE NAME : ",remoteName)

    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = { (task, progress) in
        DispatchQueue.main.async(execute: {
            // Update a progress bar
        })
    }

   var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
    completionHandler = { (task, error) -> Void in
        DispatchQueue.main.async(execute: {
            // Do something e.g. Alert a user for transfer completion.
            // On failed uploads, `error` contains the error object.
        })
    }

    let transferUtility = AWSS3TransferUtility.default()
    transferUtility.uploadData(data, bucket: s3BucketName, key: remoteName, contentType: "image/"+data.format, expression: expression, completionHandler: completionHandler).continueWith { (task) -> Any? in
        if let error = task.error {
            print("Error : \(error.localizedDescription)")
        }

        if task.result != nil {
            let url = AWSS3.default().configuration.endpoint.url
            let publicURL = url?.appendingPathComponent(S3BucketName).appendingPathComponent(remoteName)
            if let absoluteString = publicURL?.absoluteString {
                // Set image with URL
                print("Image URL : ",absoluteString)
            }
        }

        return nil
    }

}

用于为远程名称生成随机字符串。

func generateRandomStringWithLength(length: Int) -> String {
    let randomString: NSMutableString = NSMutableString(capacity: length)
    let letters: NSMutableString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    var i: Int = 0

    while i < length {
        let randomIndex: Int = Int(arc4random_uniform(UInt32(letters.length)))
        randomString.append("\(Character( UnicodeScalar( letters.character(at: randomIndex))!))")
        i += 1
    }
    return String(randomString)
}

用于调整图像大小和数据格式。使用下面的图像和数据扩展。

extension UIImage {

  func resizedImage(newSize: CGSize) -> UIImage {
    guard self.size != newSize else { return self }

    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
    self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
   }

 }

extension Data {

  var format: String {
    let array = [UInt8](self)
    let ext: String
    switch (array[0]) {
    case 0xFF:
        ext = "jpg"
    case 0x89:
        ext = "png"
    case 0x47:
        ext = "gif"
    case 0x49, 0x4D :
        ext = "tiff"
    default:
        ext = "unknown"
    }
    return ext
   }

}

关于ios - 快速上传图像 AWS S3 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348696/

相关文章:

ios - 我把NotificationCenter.default.addObserver放在哪里,以便可以从框架的任何点调用它?

amazon-web-services - 无法运行 AWS -Nuke

amazon-web-services - 每次添加消息时 AWS 死信队列 Cloudwatch 警报

xcode - 使用 xcode 调试 "failed to launch in time"

ios - 复制 UITableViewCell

swift - Storyboard初始化和取消

python |如何从 AWS 响应的结果中解析 JSON?

ios - 子类化的 UISegmentedControl titleTextAttributes 并不总是适用

ios - UIImageView 重新调整大小并同时旋转 UIImageView?

ios - 加载 URL 时 UIWebView 崩溃