サーチ…
AWS SDKを使用してS3に画像または動画をアップロードする
サンプルを開始する前に、デリゲートクラスメンバーでシングルトンを作成することをお勧めします。バックグラウンドでファイルをアップロードするというユースケースを実現し、アプリケーションの使用中にファイルをアップロードしている間もユーザーがアプリケーションを使用できるようにします背景です。
まず始めに、S3コンフィグレーションを表す列挙型を作成する必要があります。
enum S3Configuration : String
{
case IDENTITY_POOL_ID = "YourIdentityPoolId"
case BUCKET_NAME = "YourBucketName"
case CALLBACK_KEY = "YourCustomStringForCallBackWhenUploadingInTheBackground"
case CONTENT_TYPE_IMAGE = "image/png"
case CONTENT_TYPE_VIDEO = "video/mp4"
}
アプリケーションが最初に起動するときに資格情報を設定する必要があります。したがって、 didFinishLaunchingWithOptions
メソッドでAppDelegate
内に設定する必要があります( regionType
パラメータで地域を設定する必要があります)。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
let credentialProvider = AWSCognitoCredentialsProvider(regionType: .EUWest1, identityPoolId: S3Configuration.IDENTITY_POOL_ID.rawValue)
let configuration = AWSServiceConfiguration(region: .EUWest1, credentialsProvider: credentialProvider)
AWSS3TransferUtility.registerS3TransferUtilityWithConfiguration(configuration, forKey: S3Configuration.CALLBACK_KEY.rawValue)
}
AppDelegateの内部にあるので、AWS SDKで処理されるバックグラウンドコールバックを実装する必要があります。
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void)
{
// Will print the identifer you have set at the enum: .CALLBACK_KEY
print("Identifier: " + identifier)
// Stores the completion handler.
AWSS3TransferUtility.interceptApplication(application,
handleEventsForBackgroundURLSession: identifier,
completionHandler: completionHandler)
}
ユーザーがアプリをバックグラウンドに移動すると、アップロードは実際のアップロードを続けます。
AWS SDKを使用してファイルをアップロードするには、ファイルをデバイスに書き込んでSDKに実際のパスを渡す必要があります。例のために、私たちがUIImageを持っていると想像してみてください(これもまたビデオかもしれません)。それをtempフォルダに書きます:
// Some image....
let image = UIImage()
let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(fileName)
let filePath = fileURL.path!
let imageData = UIImageJPEGRepresentation(image, 1.0)
imageData!.writeToFile(filePath, atomically: true)
FileURLとfileNameは実際のアップロードに後で使用されます。
AWS SDKによって提供される2つのクロージャを定義する必要がありますが、
-
AWSS3TransferUtilityUploadCompletionHandlerBlock
- アップロードが完了したかどうかを通知するクロージャです。 -
AWSS3TransferUtilityUploadProgressBlock
- 送信された各バイトを通知するクロージャ
シングルトンを持つ予定がある場合は、これらのタイプをクラスメンバーとして定義する必要があります。実装は次のようになります。
var completionHandler : AWSS3TransferUtilityUploadCompletionHandlerBlock? =
{ (task, error) -> Void in
if ((error) != nil)
{
print("Upload failed")
}
else
{
print("File uploaded successfully")
}
}
var progressBlock : AWSS3TransferUtilityUploadProgressBlock? =
{ [unowned self] (task, bytesSent:Int64, totalBytesSent:Int64, totalBytesExpectedToSend:Int64) -> Void in
let progressInPercentage = Float(Double(totalBytesSent) / Double(totalBytesExpectedToSend)) * 100
print(progressInPercentage)
}
注:シングルトンを使用している場合は、進行状況を報告したり、ファイルが完了したときに報告する代理人を定義することができます。シングルトンを使用していない場合は、関連する型を持つ静的メソッドを作成できます。
static func uploadImageToS3(fileURL : NSURL,
fileName : String,
progressFunctionUpdater : Float -> Void,
resultBlock : (NSError?) -> Void)
{
// Actual implementation .....
// ...
// ...
}
-
progressFunctionUpdater
-progressFunctionUpdater
ある関数に戻って報告します。 -
resultBlock
- nilを返してからアップロードが正常に終了した場合は、エラーオブジェクトを送信します
皆さん、実際のアップロード:
let fileData = NSData(contentsOfFile: fileURL.relativePath!)
let expression = AWSS3TransferUtilityUploadExpression()
expression.uploadProgress = progressBlock
let transferUtility = AWSS3TransferUtility.S3TransferUtilityForKey(S3Configuration.CALLBACK_KEY.rawValue)
transferUtility?.uploadData(fileData!,
bucket: S3Configuration.BUCKET_NAME.rawValue,
key: fileName,
contentType: S3Configuration.CONTENT_TYPE_IMAGE.rawData,
expression: expression,
completionHander: completionHandler).continueWithBlock
{ (task : AWSTask) -> AnyObject? in
if let error = task.error
{
print(error)
}
if let exception = task.exception
{
print("Exception: " + exception.description)
}
if let uploadTask = task.result as? AWSS3TransferUtilityUploadTask
{
print("Upload started...")
}
return nil
}
ハッピーS3アップロード:)