iOS でファイルをアップロードする

Firebase Storage を使用すると、デベロッパーは Firebase によって提供、管理される Google Cloud Storage バケットに迅速かつ容易にファイルをアップロードすることができます。

参照を作成する

ファイルをアップロードするには、まずファイルをアップロードする Firebase Storage 内の場所への Firebase Storage 参照を作成します。

参照は、ストレージ ルートに子パスを追加して作成することができます。

Objective-C

    // Create a root reference
    FIRStorageReference *storageRef = [storage reference];

    // Create a reference to "mountains.jpg"
    FIRStorageReference *mountainsRef = [storageRef child:@"mountains.jpg"];

    // Create a reference to 'images/mountains.jpg'
    FIRStorageReference *mountainImagesRef = [storageRef child:@"images/mountains.jpg"];

    // While the file names are the same, the references point to different files
    mountainsRef.name == mountainImagesRef.name            // true
    mountainsRef.fullPath == mountainImagesRef.fullPath    // false
  

Swift

    // Create a root reference
    let storageRef = storage.reference()

    // Create a reference to "mountains.jpg"
    let mountainsRef = storageRef.child("mountains.jpg")

    // Create a reference to 'images/mountains.jpg'
    let mountainImagesRef = storageRef.child("images/mountains.jpg")

    // While the file names are the same, the references point to different files
    mountainsRef.name == mountainImagesRef.name            // true
    mountainsRef.fullPath == mountainImagesRef.fullPath    // false
    

Google Cloud Storage バケットのルートへの参照を指定してデータをアップロードすることはできません。参照は子 URL をポイントしている必要があります。

ファイルをアップロードする

参照を作成したら、次の 2 つの方法でファイルを Firebase Storage にアップロードすることができます。

  1. メモリ内の NSData からアップロードする
  2. 端末上のファイルを表す NSURL からアップロードする

メモリ内のデータからアップロードする

putData:metadata:completion: メソッドは最も簡単にファイルを Firebase Storage にアップロードできる方法です。putData:metadata:completion: は NSData オブジェクトを受け取って FIRStorageUploadTask を返します。これを使用してアップロードの管理とアップロード ステータスの監視を行うことができます。

Objective-C

    // Data in memory
    NSData *data = ...

    // Create a reference to the file you want to upload
    FIRStorageReference *riversRef = [storageRef child:@"images/rivers.jpg"];

    // Upload the file to the path "images/rivers.jpg"
    FIRStorageUploadTask *uploadTask = [riversRef putData:data metadata:nil completion:^(FIRStorageMetadata *metadata, NSError *error) {
      if (error != nil) {
        // Uh-oh, an error occurred!
      } else {
        // Metadata contains file metadata such as size, content-type, and download URL.
        NSURL *downloadURL = metadata.downloadURL;
      }
    }];
  

Swift

    // Data in memory
    let data: NSData = ...

    // Create a reference to the file you want to upload
    let riversRef = storageRef.child("images/rivers.jpg")

    // Upload the file to the path "images/rivers.jpg"
    let uploadTask = riversRef.putData(data, metadata: nil) { metadata, error in
      if (error != nil) {
        // Uh-oh, an error occurred!
      } else {
        // Metadata contains file metadata such as size, content-type, and download URL.
        let downloadURL = metadata!.downloadURL
      }
    }
    

ローカル ファイルからアップロードする

カメラの写真や動画など、端末上のローカル ファイルは、putFile:metadata:completion: メソッドを使用してアップロードできます。 putFile:metadata:completion:NSURL を受け取って FIRStorageUploadTask を返します。これを使用してアップロードの管理とアップロード ステータスの監視を行うことができます。

Objective-C

    // File located on disk
    NSURL *localFile = ...

    // Create a reference to the file you want to upload
    FIRStorageReference *riversRef = [storageRef child:@"images/rivers.jpg"];

    // Upload the file to the path "images/rivers.jpg"
    FIRStorageUploadTask *uploadTask = [riversRef putFile:localFile metadata:nil completion:^(FIRStorageMetadata *metadata, NSError *error) {
      if (error != nil) {
        // Uh-oh, an error occurred!
      } else {
        // Metadata contains file metadata such as size, content-type, and download URL.
        NSURL *downloadURL = metadata.downloadURL;
      }
    }];
  

Swift

    // File located on disk
    let localFile: NSURL = ...

    // Create a reference to the file you want to upload
    let riversRef = storageRef.child("images/rivers.jpg")

    // Upload the file to the path "images/rivers.jpg"
    let uploadTask = riversRef.putFile(localFile, metadata: nil) { metadata, error in
      if (error != nil) {
        // Uh-oh, an error occurred!
      } else {
        // Metadata contains file metadata such as size, content-type, and download URL.
        let downloadURL = metadata!.downloadURL
      }
    }
    

アップロードを積極的に管理したい場合は、完了ハンドラの代わりに putData: または putFile: メソッドを使用して、アップロード タスクを監視することができます。詳しくは、アップロードの管理をご覧ください。

ファイル メタデータを追加する

ファイルをアップロードするときにメタデータを含めることもできます。このメタデータには、namesizecontentType(一般的に MIME タイプと呼ばれます)などの標準的なファイル メタデータのプロパティが含まれます。putFile: メソッドは NSURL ファイル名拡張子からコンテンツ タイプを自動的に推測しますが、contentType をメタデータに指定することにより、自動検出されるタイプをオーバーライドすることができます。contentType の指定がなく、Firebase Storage がファイル拡張子からデフォルトのタイプを推測できない場合、Firebase Storage は application/octet-stream を使用します。ファイル メタデータについて詳しくは、ファイル メタデータの使用のセクションをご覧ください。

Objective-C

    // Create storage reference
    FIRStorageReference *mountainsRef = [storageRef child:@"images/mountains.jpg"];

    // Create file metadata including the content type
    FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init];
    metadata.contentType = @"image/jpeg";

    // Upload data and metadata
    FIRStorageUploadTask *uploadTask = [mountainsRef putData:data metadata:metadata];

    // Upload file and metadata
    FIRStorageUploadTask *uploadTask = [mountainsRef putFile:localFile metadata:metadata];
  

Swift

    // Create storage reference
    let mountainsRef = storageRef.child("images/mountains.jpg")

    // Create file metadata including the content type
    var metadata = FIRStorageMetadata()
    metadata.contentType = "image/jpeg"

    // Upload data and metadata
    let uploadTask = mountainsRef.putData(data, metadata: metadata)

    // Upload file and metadata
    let uploadTask = mountainsRef.putFile(localFile, metadata: metadata)
    

アップロードを管理する

アップロードを開始するだけでなく、pauseresumecancel メソッドを使ってアップロードを一時停止、再開、キャンセルすることもできます。これらのメソッドにより、pauseresumecancel イベントが発生します。アップロードをキャンセルするとアップロードが失敗し、アップロードがキャンセルされたことを示すエラーが返されます。

Objective-C

    // Start uploading a file
    FIRStorageUploadTask *uploadTask = [mountainsRef putFile:localFile];

    // Pause the upload
    [uploadTask pause];

    // Resume the upload
    [uploadTask resume];

    // Cancel the upload
    [uploadTask cancel];
  

Swift

    // Start uploading a file
    let uploadTask = mountainsRef.putFile(localFile)

    // Pause the upload
    uploadTask.pause()

    // Resume the upload
    uploadTask.resume()

    // Cancel the upload
    uploadTask.cancel()
    

アップロードの進捗状況を監視する

オブザーバーを FIRStorageUploadTask に追加して、アップロードの進捗状況を監視することができます。オブザーバーを追加すると、オブザーバーを削除するために使用できる FIRStorageHandle が返されます。

Objective-C

    // Add a progress observer to an upload task
    FIRStorageHandle observer = [uploadTask observeStatus:FIRStorageTaskStatusProgress
                                                  handler:^(FIRStorageTaskSnapshot *snapshot) {
      // A progress event occurred
    }];
  

Swift

    // Add a progress observer to an upload task
    let observer = uploadTask.observeStatus(.Progress) { snapshot in
      // A progress event occurred
    }
    

オブザーバーは FIRStorageTaskStatus イベントに追加することができます。

FIRStorageTaskStatus イベント 一般的な使用方法
FIRStorageTaskStatusResume タスクの開始時やアップロードの再開時に発生し、多くの場合 FIRStorageTaskStatusPause イベントと併せて使用されます。
FIRStorageTaskStatusProgress データが Firebase Storage にアップロードされると発生し、アップロードの進捗インジケータを埋め込むために使用できます。
FIRStorageTaskStatusPause アップロードが一時停止されると発生し、多くの場合 FIRStorageTaskStatusResume イベントと併せて使用されます。
FIRStorageTaskStatusSuccess アップロードが正常に完了したときに発生します。
FIRStorageTaskStatusFailure アップロードが失敗したときに発生します。エラーを調べて失敗した理由を判断します。

イベントが発生すると FIRStorageTaskSnapshot オブジェクトが戻されます。このスナップショットは、イベントが発生したときのタスクの不変のビューです。このオブジェクトには次のプロパティが含まれています。

プロパティ 説明
progress NSProgress アップロードの進捗状況を含む NSProgress オブジェクトです。
error NSError アップロード中に発生したエラーです(エラーが存在する場合)。
metadata FIRStorageMetadata アップロード中の、アップロードされているメタデータが含まれています。FIRTaskStatusSuccess イベント後の、アップロードされたファイルのメタデータが含まれています。
task FIRStorageUploadTask スナップショットのタスクです。これを使用してタスクを管理(pauseresumecancel)することができます。
reference FIRStorageReference このタスクの参照元です。

オブザーバーは個別またはステータスごとに削除したり、すべてまとめて削除したりすることもできます。

Objective-C

    // Create a task listener handle
    FIRStorageHandle observer = ...

    // Remove an individual observer
    [uploadTask removeObserverWithHandle:observer];

    // Remove all observers of a particular status
    [uploadTask removeAllObserversForStatus:FIRStorageTaskStatusProgress];

    // Remove all observers
    [uploadTask removeAllObservers];
  

Swift

    // Create a task listener handle
    let observer = ...

    // Remove an individual observer
    uploadTask.removeObserverWithHandle(observer)

    // Remove all observers of a particular status
    uploadTask.removeAllObserversForStatus(.Progress)

    // Remove all observers
    uploadTask.removeAllObservers()
    

メモリリークを防ぐために、FIRStorageTaskStatusSuccess または FIRStorageTaskStatusFailure の発生後にすべてのオブザーバーが削除されます。

エラー処理

アップロード時にエラーが発生する理由として、ローカル ファイルが存在しない、目的のファイルをアップロードする権限がユーザーにないなど、たくさんの理由が考えられます。エラーについて詳しくは、このドキュメントのエラーの処理のセクションをご覧ください。

アップロード、進捗状況の監視、エラー処理の完全な例を以下に示します。

Objective-C

    // Local file you want to upload
    NSURL *localFile = ...

    // Create the file metadata
    FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init];
    metadata.contentType = @"image/jpeg";

    // Upload file and metadata to the object 'images/mountains.jpg'
    FIRStorageUploadTask *uploadTask = [storageRef putFile:localFile metadata:metadata];

    // Listen for state changes, errors, and completion of the upload.
    [uploadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) {
      // Upload resumed, also fires when the upload starts
    }];

    [uploadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) {
      // Upload paused
    }];

    [uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) {
      // Upload reported progress
      double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
    }];

    [uploadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) {
      // Upload completed successfully
    }];

    // Errors only occur in the "Failure" case
    [uploadTask observeStatus:FIRStorageTaskStatusFailure handler:^(FIRStorageTaskSnapshot *snapshot) {
      if (snapshot.error != nil) {
        switch (snapshot.error.code) {
          case FIRStorageErrorCodeObjectNotFound:
            // File doesn't exist
            break;

          case FIRStorageErrorCodeUnauthorized:
            // User doesn't have permission to access file
            break;

          case FIRStorageErrorCodeCancelled:
            // User canceled the upload
            break;

          ...

          case FIRStorageErrorCodeUnknown:
            // Unknown error occurred, inspect the server response
            break;
        }
      }
    }];
  

Swift

    // Local file you want to upload
    let localFile: NSURL = ...

    // Create the file metadata
    let metadata = FIRStorageMetadata()
    metadata.contentType = "image/jpeg"

    // Upload file and metadata to the object 'images/mountains.jpg'
    let uploadTask = storageRef.child("images/mountains.jpg").putFile(localFile, metadata: metadata);

    // Listen for state changes, errors, and completion of the upload.
    uploadTask.observeStatus(.Pause) { snapshot in
      // Upload paused
    }

    uploadTask.observeStatus(.Resume) { snapshot in
      // Upload resumed, also fires when the upload starts
    }

    uploadTask.observeStatus(.Progress) { snapshot in
      // Upload reported progress
      if let progress = snapshot.progress {
        let percentComplete = 100.0 * Double(progress.completedUnitCount) / Double(progress.totalUnitCount)
      }
    }

    uploadTask.observeStatus(.Success) { snapshot in
      // Upload completed successfully
    }

    // Errors only occur in the "Failure" case
    uploadTask.observeStatus(.Failure) { snapshot in
      guard let storageError = snapshot.error else { return }
      guard let errorCode = FIRStorageErrorCode(rawValue: storageError.code) else { return }
      switch errorCode {
        case .ObjectNotFound:
          // File doesn't exist

        case .Unauthorized:
          // User doesn't have permission to access file

        case .Cancelled:
          // User canceled the upload

        ...

        case .Unknown:
          // Unknown error occurred, inspect the server response
      }
    }
    

これでファイルのアップロードが完了しました。次は、Firebase Storage からファイルをダウンロードする方法を学習しましょう。

フィードバックを送信...