Webブラウザからファイルを受けとる方法
日付 | 2009/07/29 |
---|---|
ID | 09-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つのメソッドが必要です。
- Compiler_Web
- 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つ
- ブラウザにマルチパートポストリクエストをさせる
- Compiler_Webを利用し変数名を4DとHTMLのタグとで合わせる
- 受けとったデータからHTTPヘッダを取り除く
参考ページ
- コマンドリファレンス:4DオブジェクトをHTMLオブジェクトにバインドする
- コマンドリファレンス:URLとフォームアクション
- Tips:BLOB用の「Position」メソッド(v2003用なのでv11での利用には修正が必要)