WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:input type="file" をperlで受け取る方法

0:[投稿] perl [2004/01/27 21:35 ][環境:ie perl5]

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

でファイルを送信しているのですが、

require 'cgi-lib.pl'
&ReadParse(*in);
して
foreach(keys(%in)){
    print "$_ = $in{$_}\n";
}
しても、アップロードしたファイル名しか出ず、ファイルの中身が
表示されません。
色々と探してみましたが、CGI.pmを使う方法ばっかりで、仕組みが
良く分かりません。

<input type="file">は、cgi-lib.plでは取得できないのでしょうか?


1:[回答] Iwa [URL] [2004/01/28 00:16 ]

できますよ。
ただ、フォーム側でちゃんとmultipart/form-dataで送ってますか?

cgi-lib.plでの例↓
http://www.tsden.org/ryutaroh/gconv-cgi.txt


2:[回答] ミツ [2004/01/28 00:18 ]

「cgi-lib upload」で検索すれば色々見つかると思いますよ。
あと、アップロードが出来る配布されているCGIにはcgi-lib.plを使ったものも少なくはないのでダウンロードして参考にしてみては?


3:[回答] perl [2004/01/28 20:44 ]

>>1、>>2
ありがとうございます。cgi-libで出来ました。
multipart/form-data の指定が必要なんですね。
必要ならデフォルトでそういう動きをするようにブラウザを作れば
いいのに、と思いますが何か不具合があるんでしょうか?


4:[回答] B-Cus [2004/01/29 00:53 ]

理由は知りませんが、RFC 1867 には、
 If a form contains <input TYPE=file> elements but does not
 contain an ENCTYPE in the enclosing <form>, the behavior
 is not specified.
とありますので、<input type=file> を書いているのに
enctype がない場合の動作は未定義です。

個人的には、
 <input type=file> が見つかって、なおかつ enctype が
 指定されていなければ、multipart/form-data としなさい。
 でも、enctype が明に指定されていたらそれに従いなさい。
というのは、メリットが少ないわりに複雑すぎるかなぁと
感じます。


5:[回答] AC [2004/01/29 22:08 ]

>>3,4
HTML4.01の仕様ではenctypeがない場合のデフォルト値は
"application/x-www-form-urlencoded"と決まっています。
これは、HTML3.2、HTML2.0でも同様です。


6:[回答] perl [2004/01/30 00:49 ]

>>5
enctype省略時にはサーバ側でファイル内容を取得出来ないという
事は、デフォルト値である"application/x-www-form-urlencoded"
ではサーバにはデータが送られないということなのでしょうか?


7:[回答] AC [2004/01/31 15:05 ]

application/x-www-form-urlencodedとは、
name=%20value%20&file=filename
のように、URLの予約文字・使用できない文字を%xxのようにエンコードして
送る方式です。

ファイル転送時には、ファイルの内容以外にも、ファイル名、ファイルサイズ、
ファイルの種類などを送るのですが、application/x-www-form-urlencoded
では、それが無理なので、multipart/form-dataを使うわけです。


8:[完了] perl [2004/02/03 14:32 ]

有り難うございます。
理屈がわかりました。そのような問題があったのですね。
いろいろ有り難うございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World