フォームベース・ファイルアップロードの仕組み

ブラウザからファイルをアップロードする仕組みをご存知ですか。

たとえアップロードの仕組みを知らなくても、普段からあまり意識することなく、ファイルをアップロードしているのではないでしょうか。

また、ASP.NET や PHP 等、様々な実行環境においてはファイルアップロードをサポートする仕組みがあるので、サーバー側でも特に何もしなくてもアップロードされたファイルを受け取ることが可能だったりします。

しかし、ISAPI 等のネイティブコード開発では、プロトコルやデータフォーマットに関する知識がないと開発できないこともしばしばです。ファイルアップロードもそのひとつです。

もちろん ISAPI にはクライアントからポストされたデータを読み取る仕組みはあるものの、「アップロードされたファイル」 というようなまとまった形ではデータを受け取ることが出来ません。あくまで、生データを受け取り、そのデータを自分で解析する必要があるのです。

さて、ファイルのアップロードは RFC1867 "Form-based File Upload in HTML" で定義されている方法に従って行われます。

アップロードフォーム

アップロードフォームは以下のようになります。

HTML の input type="file" を用います。フォームの属性には ENCTYPE="multipart/form-data" を指定します。

なぜ、マルチパート (multipart) というのかは、次の通りです。

上記のフォームによってファイルアップロード、言い換えれば、 ブラウザからサーバーにデータを送信すると、次のようなデータフォーマットに変換されてアップロードされるのです。

ポイントは Content-Type です。

Content-Type は、データの受け渡しをする時に相手側に 「これから送るデータは、 これこれこんなデータですよ」 ということを教えてあげるためのものです。

ファイルアップロードの場合は、Content-Type として、 「これは複数の部分に分かれたフォームデータですよ。そして、 複数の部分を区切る境界線 (boundary) はこれですよ」 ということを教えてあげるのです。

そうして、データを複数のパートに分けて、データ送信します。

それぞれのパートに、ファイルデータを格納することでファイルのアップロードが可能になります。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説