WEB相談室

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

タイトル:CGIで画像アップロードする方法

INT[MAIL][URL][WriteDate : Tue Nov 7 07:09:29 2000]

CGI(Perl)のフォームから画像(バイナリファイル)
をアップロードするにはどのような 流れで行えばよいのでしょうか?
またその際のセキュリティー上の注意点等ありましたら
ご教授ください。
よろしくお願いいたします。



バギンズ[MAIL][URL][WriteDate :Tue Nov 7 07:40:11 2000]

ここを参考にしてみてください。

http://wakusei.cplaza.ne.jp/twn/wwwxx034.htm

あと、KENTさんのところのClip Boardもいいかも。

注意点は、アップロードするファイルのサイズでしょうか。
無制限はやめた方がいいでしょうね。(^_^;)
あと、やばい画像データをアップロードされたくないなら、管理者がチェックするまで他の画像データを表示しておくとかでしょうか。

Qz[MAIL][URL][WriteDate :Tue Nov 7 12:59:53 2000]

アップロードのhtmlでのformは、
<form method=post enctype="multipart/form-data" action="xxx.cgi">
とします。これがないと、
<input name="xxxx" type=file>
が使用できません(たぶん)

これで、ファイルの選択ができるようになります。
CGI側では、multipartで送られてきたデータを、デコードします。
これには、cgi-lib.plやcgi.pmなどを利用するのが簡単です。
ライブラリやモジュールを使うのが嫌なら、自分で書かなければいけません。

私は、
http://ca.sakura.ne.jp/~qz/perl-script-junk/decord-multipart.txt
こんな感じで、デコードしました。
短いコードですが、メモリ効率が悪いです(笑)

一応参考になるURLを紹介します。

http://wakusei.cplaza.ne.jp/twn/wwwxx034.htm
http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm




INT[MAIL][URL][WriteDate :Tue Nov 7 13:01:58 2000]

バギンスさん
>なるほど とほほさんのアラカルとでも扱っていたんですね。
ラウンジの検索はしてたんですが みつからなかったんで。。。

さて 今作っているスクリプトでは KENTさんの
Clip Boardの 画像処理の部分を
参考にさせてもらって作っていました。
そこに該当する部分で もっと具体的に質問させていただきます。
foreach (@in) {
 if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$3; }
 if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; }
 if ($_ =~ /application\/x-macbinary/i) { $macbin=1; }
}
~ /(.*)Content-type:(.*)/i 、
~ /(.*)filename=(.*)/i) と $3、 $2
に何が入るのかがが よくわかりません

また 呼び出しもとの
# ファイル添付処理
if ($in{'upfile'}) { &UpFile; }
ですが 引数は 渡していないのですがsub UpFile
では @inを使っています。。。外部変数でもなさそうですし。。。

そして デコード部分の&ReadParse
おそらくcgi-lib.plの中の54行目以降の
sub ReadParse {
  # Disable warnings as this code deliberately uses local and environment
  # variables which are preset to undef (i.e., not explicitly initialized)
 :
 :
}
だとはおもんですけど 何をしてるのかさっぱりわからないです。
(このサブルーチンで100行ほどあったので 書き込みはしません)

落ちこぼれに 愛の手をよろしくお願いします。

INT[MAIL][URL][WriteDate :Tue Nov 7 13:06:19 2000]

バギンスさん
>なるほど とほほさんのアラカルとでも扱っていたんですね。
ラウンジの検索はしてたんですが みつからなかったんで。。。

さて 今作っているスクリプトでは KENTさんの
Clip Boardの 画像処理の部分を
参考にさせてもらって作っていました。
そこに該当する部分で もっと具体的に質問させていただきます。
foreach (@in) {
 if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$3; }
 if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; }
 if ($_ =~ /application\/x-macbinary/i) { $macbin=1; }
}
~ /(.*)Content-type:(.*)/i 、
~ /(.*)filename=(.*)/i) と $3、 $2
に何が入るのかがが よくわかりません

また 呼び出しもとの
# ファイル添付処理
if ($in{'upfile'}) { &UpFile; }
ですが 引数は 渡していないのですがsub UpFile
では @inを使っています。。。外部変数でもなさそうですし。。。

そして デコード部分の&ReadParse
おそらくcgi-lib.plの中の54行目以降の
sub ReadParse {
  # Disable warnings as this code deliberately uses local and environment
  # variables which are preset to undef (i.e., not explicitly initialized)
 :
 :
}
だとはおもんですけど 何をしてるのかさっぱりわからないです。
(このサブルーチンで100行ほどあったので 書き込みはしません)

落ちこぼれに 愛の手をよろしくお願いします。

ちゃいぱ[MAIL][URL][WriteDate :Tue Nov 7 14:46:22 2000]

どうも、
$3はバグですか?(括弧が2つなので...)
$2はアップロードするパス名+ファイル名です。

@inはReadParseでの引数無しの時のデフォルト引数です。

cgi-lib.plは難しいですね。
確か、以下の本に解説が出ていたとおもいます。
実践入門 Perl アーク・シンク・タンク 三島俊司/著 技術評論社

Qz[MAIL][URL][WriteDate :Tue Nov 7 15:20:37 2000]

CGI.pmを使ったアップロードの例というのを見つけました。
http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.html

Perl初心者の部屋
http://www.harukaze.net/~mishima/perl/index.html
ここのリソースは、探せば、いろいろでてきます。
ちゃいばさんが紹介された三島俊司さんのサイトです^^

画像アップロード系の掲示板は、ぼくもつくったことがあるので、
紹介?しますね。参考になれば、参考にしてください。

multipartがどういう形のものかを知るためにつくったCGI
http://ca.sakura.ne.jp/~qz/perl-script-junk/mpost_cgi.txt

画像ファイルの縦横のサイズをとるために作ったサブルーチン例
http://ca.sakura.ne.jp/~qz/perl-script-junk/get-picsize.txt

Mac版のIE4からのファイルはMacバイナリがついてくるので、そのバイナリをとるためのサブルーチン
http://ca.sakura.ne.jp/~qz/perl-script-junk/mac-bin-cut.txt

画像をアップロードする掲示板
http://ca.sakura.ne.jp/~qz/perl-script-junk/pup_cgi_old.txt
http://ca.sakura.ne.jp/~qz/perl-script-junk/pup_cgi.txt

上記のスクリプトは、Perl初心者のころ(まだ初心者ですが)つくったものなので、ところどころあやしいところがあります。
いまなら、こうは書かないな〜とか(笑)

http://ca.sakura.ne.jp/~qz/perl-script-junk/pup_cgi_old.txt
このCGIに関しては、著作権フリーと同じ扱いでOKです。
改造したものを配布しようが、売ろうがぼくに断ることはないです^^

http://ca.sakura.ne.jp/~qz/perl-script-junk/pup_cgi.txt
こちらは、上記のスクリプトをSeasonさんというかたが、手直しされたものを、さらにぼくが手直ししてしまったせいで、
著作権の所在が、ぼくとSeasonさんにあるというややこしいものなので、
ちょっと、わけわからんです(おい

にしても、見直すと結構、笑える・・
ロックはファイル作成形式のロックだわ、
$sec  = "0$sec"  if($sec < 10);だわ、
foreach(0..3)してるわ、
クッキーはエンコードしてないわ・・・
なかなか、あやしい・・・

ソースコードに関しては、かなりきれいにつくったつもりなので、
見やすいと思います^^


バギンズ[MAIL][URL][WriteDate :Tue Nov 7 15:26:03 2000]


>ちゃいぱさん
$3はバグではなくコピーミスだと思います。
私がダウンロードしたものは
if ($_ =~ /(.*)Content-type:(.*)\/(.*)/i) { $tail=$3; }
になっています。

>INTさん
cgi-lib.plのReadParseでアップロードされた情報がすべて変数に入ってきますので、あとは解析してファイルに書き込むだけです。
sub UpFileは画像データの解析&書き込みを行なっています。
かなり見やすいソースだと思うのですが何が気になっているのでしょう?

こういう言い方はあまりよくないかもしれませんが、sub UpFileをまるごとパクる為に何をすればいいか?を考た方がいいのでは?(^_^;)

バギンズ[MAIL][URL][WriteDate :Tue Nov 7 15:31:16 2000]


>Qzさん
いろいろやってますね。(^_^)
私の場合、友人に頼まれてclip.cgiのファイルアップロード部分を他の掲示板cgiへ組み込んだ事はあるのですが、それ以上の事は特にやっていないので、私も参考にさせていただきます。(^_^;)

Qz[MAIL][URL][WriteDate :Tue Nov 7 16:44:38 2000]


>バキンズさん
昔、YYBBSのアイコンがブラウザからアップロードできたら
おもしろいだろうな、とおもって作ったものなんですよ。
最初とぼくもこぴぺ(とはいってもそのころはclip.cgiはありませんでしたが)して作成したのですが、
配布したいという人がいたので、全部、自分でコードを書きました。
sysreadやreadである程度よみこみながら、解析するやりかたが、
一番はやいとは思うのですが、いい方法が思いつかない・・・
そもそも、これでは無理なのかもしれません。
でも大きいファイルをアップロードするとなると、メモリ効率は、
考慮しないといけないですからねえ・・・

>INTさん
まだ、ありました。
http://ca.sakura.ne.jp/~qz/perl-script-junk/upload_cgi.txt
単純にファイルをサーバへアップロードして、img要素かa要素での出力するCGIです。
こちらも、著作権フリーと同じ扱いで結構です。



Qz[MAIL][URL][WriteDate :Tue Nov 7 18:07:56 2000]

リソースの追加。
http://www.hk.airnet.ne.jp/~ahero/cgi/cgiex11.html
http://www.tsden.org/ryutaroh/fileupload-j.shtml

#調べたわけじゃなくて、たまたま、見てたリソースに紹介されていたので^^



INT[MAIL][URL][WriteDate :Wed Nov 8 21:20:09 2000]

ありがとうございました!なんとかできました。

>ちゃいぱさん
ReadParseの後に 値の扱い方が わかりませんでしたが
デフォルト引数というアドバイスのおかげで なんとか
わかりました。

>バギンズさん
あくまで 画像アップロードが目的でした。
その手段として sub UpFileを参考に(パク?)しました。
いくつかのソースを見てみてclipが見やすいソース
でしたので 私でもできるかなとおもいました。
最初から どこがわからないか はっきり してればよかったんですが
あせって 原因を追求せずに質問しまして 混乱しました。
すみませんm(..)m

>Qz
多くのソースありがとうございました。
私の場合 GETも使うCGIでしたので
http://ca.sakura.ne.jp/~qz/perl-script-junk/pup_cgi.txt 
↑役に立ちました。
回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]