Article View: fj.lang.perl
Article #239Re: [Q] multipart/form-data ???
From: Masakatz Canada
Date: Sun, 29 Mar 1998 00:00
Date: Sun, 29 Mar 1998 00:00
115 lines
5312 bytes
5312 bytes
かなだです。
In article <6fenq8$sc5$1@buggy.news.easynet.net>, kohei-salut@mediatelier.com says...
>WEBのページをブラウズしているクライアントから、JPEG等の画像ファイルを受け取
>って、自動的にぺーじを更新するような事が出来ないものかと思っています。
>Perlで書いたCGIでファイルを受け取る方法を使っている方、もしくはそれについて
>解説されたものをご存知の方、教えてください。
書籍では、
「CGIプログラミング」オライリー・ジャパン ISBN4-900900-13-3
Shishir Gundavaram著、田辺 茂也 監訳、(株)エディックス 訳
の458ページに、CGI LiteというPerl5ライブラリを使った方法の
解説が3ページにわたってあります。
CGI Liteは使ったことはないのですが、多分自力で書くよりは簡
単でしょう。
多分他にも似たようなライブラリが幾つかあるのではないかと思
います。
CGI Liteは、
<ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/modules/by-module/CGI_Lite/>
などのCPANミラーからダウンロードできます。
仕組みについては、RFC-1867(Form-based File Upload in HTML)
<http://ds.internic.net/rfc/rfc1867.txt>
で定義されていますので、そちらを参照してください。
また、ファイル・アップロードの仕組みについて、昔書いた文章
が出て来ましたので、それもそのまま載せます。
ただし、書きかけでほったらかしにしてあったものなので、内容
については保証しません。詳しくはRFCに譲ります。
>また、受け取る側のサーバーに必要な特別な条件などあるのでしょうか?(Netscape
>Enterprise Serverじゃないとだめとか・・・。)
Form-based File Upload in HTMLは、どちらかと言うとブラウザ
依存の技術ですから、サーバーは関係ないと思います。
というわけで逆にブラウザによっては動作しませんのでご注意く
ださい。
# これは余談ですが、この方法だと10Mや100Mのファイルを送るこ
# とが簡単にできてしまうので、ファイル・サイズのチェックは
# ファイルを受け取る前に必ずしたほうがよいと思います。
# まあ、ファイル・アップロードに限った話じゃないですが。
------------------------- ここから -------------------------------
CGIでのファイルの受信法
まず、HTMLは次のように記述します。
<FORM ACTION="/cgi-bin/CGI_NAME.cgi"
ENCTYPE="multipart/form-data"
METHOD=POST>
<INPUT TYPE=TEXT NAME=foo>
<INPUT TYPE=FILE NAME=baa>
</FORM>
ENCTYPEの部分と、<INPUT TYPE=FILE>の部分に注目してください。
仮に、fooに"ABC"と入力し、baaに「file.jpg」というファイル
を送信した場合、CGIの方ではデータは次のような形で届きます。
<FORM>行でMETHOD=POSTを指定していますので、このデータは標
準入力から取得できます。
### begin ###
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="foo"
Content-Type: text/plain
ABC
--AaB03x
content-disposition: form-data; name="baa"; filename="file.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
****** file.jpg の内容 ****
--AaB03x--
### end ###
初めの1行がデータのMIMEヘッダとなります。
MIMEヘッダにある、boundary=AaB03x の、AaB03xがデリミタになります。
デリミタは、ユーザー側のブラウザが(大抵の場合ランダムな文字列を)
生成します。次の空行が、MIMEヘッダの終了を表します。
初めのMIMEヘッダは複数行にわたる可能性もありますので、MIMEヘッダ
をスキップするには、MIMEヘッダの終了を示す空行を検出した方がよい
でしょう。
各データは、複数個数のハイフンの後に、デリミタが続いた行で区切ら
れています。
各データには、複数行のMIMEヘッダと、その終了を示す1行の空行が付
随しています。
Content-disposition行から、INPUTタグのNAMEの名前や、ユーザが送っ
たファイルのファイルネーム(例えばfile.jpg)が取得できます。
またContent-Type行からは、データのMIMEタイプが取得できます。
デフォルトはtext/plainです。ファイルを送信した場合、image/jpegな
どになる場合がありますが、殆どの場合ユーザー側のブラウザが拡張
子や(Macの)ファイルタイプから判別したものなので、正しいという確
証はありません。
Content-Transfer-Encoding行に、binaryと書かれている場合がありま
すが、これは続くデータがバイナリデータであることを表しています。
また、データの終了は、複数個数のハイフンの後に、デリミタが続き、
その後にハイフン2つが続く文字列で表されます。
各データ行は、RFCによると CR/LFで区切られます。
------------------------ ここまで ------------------------------
--
か な だ ま さ か つ
canada@kt.rim.or.jp
Technical Details
Message-ID:
<6fkn1g$d18$1@news.kt.rim.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<6fenq8$sc5$1@buggy.news.easynet.net>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 1043e7,c806ea10398a9bdc X-Google-Attributes: gid1043e7,public From: canada@kt.rim.or.jp (Masakatz Canada) Subject: Re: [Q] multipart/form-data ??? Date: 1998/03/29 Message-ID: <6fkn1g$d18$1@news.kt.rim.or.jp> X-Deja-AN: 338750937 References: <6fenq8$sc5$1@buggy.news.easynet.net> Content-Type: Text/Plain; charset=ISO-2022-JP Organization: RIMNET Mime-Version: 1.0 Newsgroups: fj.lang.perl