🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.perl
Article #239

Re: [Q] multipart/form-data ???

#239
From: Masakatz Canada
Date: Sun, 29 Mar 1998 00:00
115 lines
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-mail
References: <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