Using the s3transferutility we will upload images from your camera or photo library in swift. View the source on github
In this example We will have 2 buttons – Camera Upload and Picture Upload.
Depending on what is selected as the data source (camera or photo library) it will upload the file accordingly. If you use the camera button you will notice that we will have to create a temp directory when uploading the image, since there is no asset location for it on the device.
You can find more info in the aws sdk
//
// PictureViewController.swift
//
//
// Created by Jose Deras on 12/30/15.
// Copyright © 2015 Jose Deras. All rights reserved.
//
import UIKit
import AWSMobileAnalytics
import AWSCognito
import AWSS3
import AWSCore
import Photos
import MobileCoreServices
class PictureViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
@IBOutlet weak var progressView: UIProgressView!
@IBOutlet weak var imageView: UIImageView!
@IBAction func openCameraButton(sender: AnyObject) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
let camImagePicker = UIImagePickerController()
camImagePicker.delegate = self
camImagePicker.sourceType = UIImagePickerControllerSourceType.Camera;
camImagePicker.allowsEditing = false
self.presentViewController(camImagePicker, animated: true, completion: nil)
}
}
@IBAction func openPhotoLibrary(sender: AnyObject) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
imagePicker.allowsEditing = true
self.presentViewController(imagePicker, animated: true, completion: nil)
}
}
//handles upload
var uploadCompletionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
var uploadFileURL: NSURL?
override func viewDidLoad() {
super.viewDidLoad()
//setting progress bar to 0
self.progressView.progress = 0.0;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//begin upload from photo library
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
//first run if its coming from photo album
if(picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary)
{
//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)!
let photoURL = NSURL(fileURLWithPath: localPath)
// let imageWithData = UIImage(data: imageData)!
//defining bucket and upload file name
let S3BucketName: String = "bucketNAme"
let S3UploadKeyName: String = "test_libarayUpload.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)
self.progressView.progress = progress
// self.statusLabel.text = "Uploading..."
NSLog("Progress is: %f",progress)
})
}
self.uploadCompletionHandler = { (task, error) -> Void in
dispatch_async(dispatch_get_main_queue(), {
if ((error) != nil){
NSLog("Failed with error")
NSLog("Error: %@",error!);
// self.statusLabel.text = "Failed"
}
else if(self.progressView.progress != 1.0) {
// self.statusLabel.text = "Failed"
NSLog("Error: Failed - Likely due to invalid region / filename")
}
else{
// self.statusLabel.text = "Success"
NSLog("Sucess")
}
})
}
let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility()
transferUtility?.uploadFile(photoURL, bucket: S3BucketName, key: S3UploadKeyName, contentType: "image/jpeg", expression: expression, completionHander: uploadCompletionHandler).continueWithBlock { (task) -> AnyObject! in
if let error = task.error {
NSLog("Error: %@",error.localizedDescription);
// self.statusLabel.text = "Failed"
}
if let exception = task.exception {
NSLog("Exception: %@",exception.description);
// self.statusLabel.text = "Failed"
}
if let _ = task.result {
// self.statusLabel.text = "Generating Upload File"
NSLog("Upload Starting!")
// Do something with uploadTask.
}
return nil;
}
//end if photo library upload
self.dismissViewControllerAnimated(true, completion: nil);
}
//second check if its coming from camera
else if(picker.sourceType == UIImagePickerControllerSourceType.Camera)
{
// var imageToSave: UIImage = info(UIImagePickerControllerOriginalImage) as UIImage
var imageToSave: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
//defining bucket and upload file name
let S3BucketName: String = "bucketName"
//setting temp name for upload
let S3UploadKeyName = "Test2CameraUpload.jpg"
//settings temp location for image
let imageName = NSURL.fileURLWithPath(NSTemporaryDirectory() + S3UploadKeyName).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)!
let photoURL = NSURL(fileURLWithPath: localPath)
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)
self.progressView.progress = progress
// self.statusLabel.text = "Uploading..."
NSLog("Progress is: %f",progress)
})
}
self.uploadCompletionHandler = { (task, error) -> Void in
dispatch_async(dispatch_get_main_queue(), {
if ((error) != nil){
NSLog("Failed with error")
NSLog("Error: %@",error!);
// self.statusLabel.text = "Failed"
}
else if(self.progressView.progress != 1.0) {
// self.statusLabel.text = "Failed"
NSLog("Error: Failed - Likely due to invalid region / filename")
}
else{
// self.statusLabel.text = "Success"
NSLog("Sucess")
}
})
}
let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility()
transferUtility?.uploadFile(photoURL, bucket: S3BucketName, key: S3UploadKeyName, contentType: "image/jpeg", expression: expression, completionHander: uploadCompletionHandler).continueWithBlock { (task) -> AnyObject! in
if let error = task.error {
NSLog("Error: %@",error.localizedDescription);
// self.statusLabel.text = "Failed"
}
if let exception = task.exception {
NSLog("Exception: %@",exception.description);
// self.statusLabel.text = "Failed"
}
if let _ = task.result {
// self.statusLabel.text = "Generating Upload File"
NSLog("Upload Starting!")
// Do something with uploadTask.
}
return nil;
}
//end if photo library upload
self.dismissViewControllerAnimated(true, completion: nil);
}
else{
NSLog("Shit fucked up yo")
}
}
}