ローカルディスクのバイナリファイルをサーバにアップロードする

ローカルディスクのバイナリファイルをサーバにアップロードする

macOS Mojava 10.14.6 / Xcode 11.3.1 / Swift 5.0
Swiftのアプリケーションで実装することは、ありそうにないと思うが、仕組みの理解という意味で紹介しておきます。
HTTPリクエストによりローカルディスクのバイナリファイルをサーバにアップロードする方法は二つある。

サンプルアプリケーション

[upload1]
Openパネルを開いてアップロードするファイルを選択する。イメージファイルの場合イメージを表示する。アップロード方式を選択してボタンをクリックする。送信されたデータは、サーバのPHPスクリプトによりそれぞれの方式に従って所定のディレクトリに保存される。

(1) multipart/form-data形式でバイナリデータを送信する

リクエストメッセージを作成して送信する

Content-Type を multipart/form-data とし、 データは multipart形式に準拠して配置していくこと。
境界文字列の位置、改行コードの数と位置は決められた形式の通りに配置すること。境界文字列は先頭に"--"を付加することを忘れないように。
境界文字列は、1〜70文字までの任意な文字列を設定することになっている。文字数が多いとパフォーマンスに影響を及ぼすらしいが、そもそも文字数が少ない場合の弱点、多い場合のメリットはどういうものなのだろうか?ざっと調べただけでは私にはわからなかった。主要なブラウザは40文字前後で実装しているようなので、ここでは30文字のランダムな文字列としている。

メッセージの中身

サーバ側の処理(PHPスクリプト)

受信したファイルデータはテンポラリファイルに一時的に格納されるので、それを任意の名前で特定のディレクトリに移動する。 ここでは PHPスクリプトがあるフォルダの下の dataディレクトリに格納している。

(2) ファイルをBASE64形式の文字列に変換してアップロードする

MIME拡張方式により、ファイルデータをBASE64形式の文字列にエンコードし、リクエストメッセージのPOSTデータの1つとして送信する。

リクエストメッセージを作成して送信する

Content-Type を application/json とし、JSON形式のデータとして送信している。(データは x-www-form-urlencoded のパラメータとして送ってもかまわない)

サーバ側の処理(PHPスクリプト)

データは、php://inputストリームから読み込む。BASE64データのデコードは、base64_decode関数で行う。デコードしたデータは任意のディレクトリにファイルとして出力する。ここでは PHPスクリプトがあるフォルダの下の dataディレクトリに格納している。MAX_FILE_SIZE は受け取るが使用していない。

付録

HTTPリクエストの送受信(同期処理)

アップロードファイルのサイズの上限を引き上げる方法

PHPの設定ファイル(php.ini)のパラメータ値を変更する。例えば、10Mバイトのファイルをアップロードするときは次のようにする。multipart/form-data方式の場合リクエストパラメータに MAX_FILE_SIZEの指定も必要である。

php.iniファイルの場所を探す方法(よく行方不明になる)

ソースコード

UAView UIコントロールの作成
NewPractice_Swift/44_UAFileUpload