Tips

Webブラウザからファイルを受けとる方法

日付2009/07/29
ID09-056
バージョン11
プラットフォームWin & Mac

Webブラウザから送信されたファイルを4DのWebサーバで受けとることは可能です。いくつかのポイントを押さえれば、比較的簡単にブラウザからファイルを4Dで受けとることができます。

Webブラウザ側

ご存知の通り、ブラウザの動作を決めるのは、HTMLです。

ブラウザから、ファイルを送信するためinputタグのfileタイプを使います。

<input type="file" name="file" />

このとき、ファイル送信のためにマルチパートポストリクエストを使うように、formタグで指定しておくことを忘れないでください。簡単なファイル送信のHTMLは、次のようになものになります。

<html>
<body>
<form action="/4DACTION/ReceiveFile" method="post" enctype="multipart/form-data">
<input type="file" name="filedata" />
<input type="submit" value="送信" />
</form>
</body>
</html>

4D側

4D側では、最低2つのメソッドが必要です。

  1. Compiler_Web
  2. formタグのactionで指定したメソッド

前述のHTMLソースの場合には、Compiler_Webの他にReceiveFileという名称のメソッドが必要になります。前述のHTMLソースでファイルを受けとるには次のように書きます。

Compiler_Web

C_BLOB(filedata)  `inputタグで指定した変数名

ReceiveFile

BLOB TO DOCUMENT(Filepath;filedata)  `変数filedataには受信したファイルデータが入っている(ただし後述の注意事項に配慮)

ReceiveFileメソッドはWebサーバで利用できるように、作成後にメソッドプロパティで「4DACTION、4DMETHODおよび4DSCRIPTで利用可能」オプションを有効にします。

これで準備完了です。

テスト

ブラウザでファイルを指定して送信ボタンを押すと、4DのWebプロセスはCompiler_Webに書かれた定義に従って変数を用意します。そしてReceiveFileメソッドが呼び出された時には、inputタグで指定した変数名と同じ4Dの変数filedataにファイルデータが収まった状態になっています。後は、これを保存するあるいは処理に使うだけです。

注意事項

実は変数filedataに収められたファイルデータには、HTTPヘッダも含まれています。HTTPヘッダには使い道があるのですが、ここでは解説を省かせてもらいます。

純粋にファイル部分だけを取り出すなら、データの冒頭に収められているHTTPヘッダを取り除く必要があります。HTTPヘッダとHTTPボディの境界は、CR+LFの2連続で表現されています。2連続のCRLFコードを見つけ出し、そこまでを削除すれば、純粋なファイルデータを取り出すことができます。

ポイント

実現のポイントは3つ

  1. ブラウザにマルチパートポストリクエストをさせる
  2. Compiler_Webを利用し変数名を4DとHTMLのタグとで合わせる
  3. 受けとったデータからHTTPヘッダを取り除く

参考ページ