String文字列をファイル化してアップロードする方法(Swift)
Table of Contents
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をセットで考えること」これが重要のようです。