🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Kohei OKUMURA Fri, 27 Mar 1998 00:00
[Q] multipart/form-data ???
#230
Author: Kohei OKUMURA
Date: Fri, 27 Mar 1998 00:00
30 lines
1560 bytes
こんにちは。

WEBのページをブラウズしているクライアントから、JPEG等の画像ファイルを受け取
って、自動的にぺーじを更新するような事が出来ないものかと思っています。
いくつかのHTMLリファレンスにNetscapeのブラウザーで、

<FORM ENCTYPE="multipart/form-data" ACTION="cgi_url" METHOD="post">
<INPUT TYPE="file">

の様なことをすると出来そうなことが書いてありますが、具体的に解説されたものに
行き当たりません。

Perlで書いたCGIでファイルを受け取る方法を使っている方、もしくはそれについて
解説されたものをご存知の方、教えてください。
また、受け取る側のサーバーに必要な特別な条件などあるのでしょうか?(Netscape
Enterprise Serverじゃないとだめとか・・・。)

よろしくお願いします。



//////  Kohei OKUMURA (Art Director, Multimedia Creative Director)
//////  kohei@mediatelier.fr
//////
//////  MediAtelier s.a.r.l. + MediAtelier Paris!
//////  6, rue Beauregard 75002 Paris FRANCE
//////  tel: +33 (1) 55 34 38 44
//////  fax: +33 (1) 55 34 38 46
//////  mobile: +33 (6) 60 43 75 97
Re: [Q] multipart/form-data ???
#239
Author: 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads