当前位置: 首页 > 面试题库 >

Swift-AWS S3从照片库上传图像并下载

卞琨
2023-03-14
问题内容

我看过许多亚马逊文档,但是找不到足够的信息来使用Swift将图像上传和下载到S3。
我怎样才能做到这一点?


问题答案:

经过大量研究后,我开始了这项工作,

import AWSS3
import AWSCore

上载:

我认为您已经实施UIImagePickerControllerDelegate了。

第1步:

  • 创建用于保存网址的变量:

    var imageURL = NSURL()
    
  • 创建上传完成处理程序obj:

    var uploadCompletionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
    

步骤2: 从中获取图片网址imagePickerController(_:didFinishPickingMediaWithInfo:)

  • imageURL在此委托方法中设置的值:
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){
    
    //getting details of image
    let uploadFileURL = info[UIImagePickerControllerReferenceURL] as! NSURL
    
    let imageName = uploadFileURL.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as String
    
    // getting local path
    let localPath = (documentDirectory as NSString).stringByAppendingPathComponent(imageName!)
    
    //getting actual image
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
    let data = UIImagePNGRepresentation(image)
    data!.writeToFile(localPath, atomically: true)
    
    let imageData = NSData(contentsOfFile: localPath)!
    imageURL = NSURL(fileURLWithPath: localPath)
    
    picker.dismissViewControllerAnimated(true, completion: nil)
    

    }

步骤3: 设置为“将图像上传到存储桶” uploadImage后,调用此方法imageURL

func uploadImage(){

    //defining bucket and upload file name
    let S3BucketName: String = "bucketName"
    let S3UploadKeyName: String = "public/testImage.jpg"


    let expression = AWSS3TransferUtilityUploadExpression()
    expression.uploadProgress = {(task: AWSS3TransferUtilityTask, bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) in
        dispatch_async(dispatch_get_main_queue(), {
            let progress = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
            print("Progress is: \(progress)")
        })
    }

    self.uploadCompletionHandler = { (task, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), {
            if ((error) != nil){
                print("Failed with error")
                print("Error: \(error!)");
            }
            else{
                print("Sucess")
            }
        })
    }

    let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility()

    transferUtility.uploadFile(imageURL, bucket: S3BucketName, key: S3UploadKeyName, contentType: "image/jpeg", expression: expression, completionHander: uploadCompletionHandler).continueWithBlock { (task) -> AnyObject! in
        if let error = task.error {
            print("Error: \(error.localizedDescription)")
        }
        if let exception = task.exception {
            print("Exception: \(exception.description)")
        }
        if let _ = task.result {
            print("Upload Starting!")
        }

        return nil;
    }
}

下载:

func downloadImage(){

    var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock?

    let S3BucketName: String = "bucketName"
    let S3DownloadKeyName: String = "public/testImage.jpg"

    let expression = AWSS3TransferUtilityDownloadExpression()
    expression.downloadProgress = {(task: AWSS3TransferUtilityTask, bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) in
        dispatch_async(dispatch_get_main_queue(), {
            let progress = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
            print("Progress is: \(progress)")
        })
    }

    completionHandler = { (task, location, data, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), {
            if ((error) != nil){
                print("Failed with error")
                print("Error: \(error!)")
            }
            else{
                //Set your image
                var downloadedImage = UIImage(data: data!)
            }
        })
    }

    let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility()

    transferUtility.downloadToURL(nil, bucket: S3BucketName, key: S3DownloadKeyName, expression: expression, completionHander: completionHandler).continueWithBlock { (task) -> AnyObject! in
        if let error = task.error {
            print("Error: \(error.localizedDescription)")
        }
        if let exception = task.exception {
            print("Exception: \(exception.description)")
        }
        if let _ = task.result {
            print("Download Starting!")
        }
        return nil;
    }

}

参考 用于上传图片

参考 下载图片

非常感谢jzorz



 类似资料:
  • 我的代码在下面..在中 在onActivityResult(int requestCode,int resultCode,Intent data)中

  • 本文向大家介绍Swift图像处理之优化照片,包括了Swift图像处理之优化照片的使用技巧和注意事项,需要的朋友参考一下 Core Image能通过分析图片的各个属性,人脸的区域等进行自动优化图片。我们只需要调用autoAdjustmentFiltersWithOptions这个API方法获取各个自动增强滤镜来优化图片即可。不管是人物照片还是风景照均可增强效果。 (以前另外还有个叫autoAdjus

  • 问题内容: 我想从我的应用程序中的用户照片库访问照片,而我正在查看UIImagePickerController。但是,我想知道是否可以在不将照片实际存储在应用程序中的情况下访问和查看照片库中的照片?因此,基本上,该应用将存储对所选照片的​​引用,而不是存储照片本身。这是为了防止该应用占用大量空间来存储每张照片。 谢谢! 问题答案: 它不是那么简单,但是正如Rob所提到的,您可以保存照片资产url

  • 问题内容: 我想从我的应用程序中的URL加载图像,因此我首先尝试使用Objective-C,但是它可以正常工作,但是对于Swift,我遇到了编译错误: ‘imageWithData’不可用:使用对象构造’UIImage(data :)’ 我的功能: 在Objective-C中: 有人可以解释一下为什么Swift无法使用它,以及如何解决该问题。 问题答案: Xcode 8或更高版本•Swift 3或

  • 我想从我的应用程序中的URL加载一个图像,所以我首先尝试使用Objective-C,它成功了,但是,使用Swift,我有一个编译错误: “imageWithData”不可用:使用对象构造“UIImage(数据:)” 我的职能: 在目标C中: 有人能给我解释一下为什么不能与Swift一起工作,以及我如何解决这个问题。