iOSアプリ内で生成した文字列を、ファイル化してアップロードする方法について解説します。 この記事で紹介する方法では、一時ファイルとして保存する必要もなく、プログラムから直接アップロードすることができます。 (別に特殊な方法ではなく、ちょっと考えてみれば当然な実装でした……)

前提

今回は、以下のような環境を前提にします。アップロードの部分をシンプルにするため、Firebase Strageにアップロードすることにします。

  • Swift(iOSアプリ)
  • Firebase

具体的な手順

方法はいたってシンプルです!

アップロードする文字列の準備

まずはじめに、アップロードする文字列を作ります。 どんな方法でも構いません。

let stringToUpload: String = "アップロードする文字列"

Stringの中身が、JSONやXMLでも大丈夫

let jsonString: String = 
"""
{
    "someObject": {
        "id": 1, 
        "name": "Something"
    }
}
"""

文字列をデータに変換する

次に、文字列をDataオブジェクトにします。Stringのdata(using:)を使用します。
data(using:) - NSString | Apple Developer Documentation

guard let data = stringToUpload.data(using: .utf8) else {
    // Optionalで返るので、変換できない場合の処理を入れておく
    return
}

StringがDataになっていれば良いので、ここの実装もどんな方法でも構いません。たとえば、Codableを実装したクラスとJSONEncoderを使用してDataを作ることもできます。

アップロードするときに、MIMEタイプをつける

最後に、MIMEタイプを付加してFirebaseのStrageにアップロードします。

// 今回はFirebase Storageにアップロードします
import FirebaseStorage

// ファイルを置く場所の参照を取得する
let storage: Storage = Storage.storage()
let storageRef: StorageReference = storage.reference()
let fileReference = storageRef.child("string.txt")  // 拡張子はあくまでファイル名の一部

// 先程作った文字列のデータ(data)と、MIMEタイプを渡して、Storageにputする
let _ = fileReference.putData(data, metadata: "application/json") { (metadata, error) in
    guard let _ = metadata else {
        print("Uh-oh, an error occurred! \(String(describing: error))")
        return
    }
}

これでOK!

Firebase Storage以外にアップロードする場合

そんなに難しいことではありません。 POSTやPUTのリクエストヘッダに、Content-Type: text/plainのようなヘッダをつけるだけです。 「いま送信しているデータは、Content-Typeで宣言している形式のデータですよ〜」と、サーバーに教えてあげるだけでした。

Content-Typpe: multipart/form-data; boundary=hogehogeの場合も、ライブラリを使用していればbodyをいい感じに整形してくれるので、特別意識することはないかなと思います。

まとめ

文字列データを、ファイル化してアップロードする方法をまとめました。 「ファイル化して」という表現は、正確な表現ではなかったかもしれません。「Data & Content-Typeをセットで考えること」これが重要のようです。