プロが教える店舗&オフィスのセキュリティ対策術

Perl CGIモジュールを使ってファイルのアップロードをしたいのですが、うまくいきません。
以下HTML部分
===================================================================
<form action="test.cgi" enctype="multipart/form-data" method=post>
1つめのファイルを選択<input type="file" name="upimg1" size=40><br>
<input type=submit value=アップロード></form>
====================================================================

受け取るCGI
====================================================================
#!/usr/bin/perl

use CGI qw(:standard);
$upimg1 = param('upimg1');
open UP,"> ./img_dir/sample.jpg";
while(<$upimg1>){
print UP $_;
}
close UP

print <<"EOL";
Content-type: text/html

<html>
<body>
Files have been uploaded.<br>
$file1<br>
$file2<br>
</body>
</html>
EOL
exit;
=====================================================================
実際アップフォルダ内にはsample.jpgがあるのですが、0バイトできちんとアップされていません。
本をみて自分なりにやってみたのですが・・・
どこがまちがっていますか?よろしくお願いします。

A 回答 (3件)

$query= new CGI;


$upimg1 = $query->param('upimg1');
にしてみるとか
    • good
    • 0
この回答へのお礼

0バイトではなくなりました。選択した画像サイズがアップできましたが、jpegファイルをアップして表示ができませんね・・・

お礼日時:2005/05/22 11:02

> use CGI qw(:standard);


> $upimg1 = param('upimg1');
> open UP,"> ./img_dir/sample.jpg";
> while(<$upimg1>){
> print UP $_;
> }

この部分を以下のように変更して下さい。

use CGI qw(:standard);
$upimg1 = param('upimg1');
while (read($upimg1, $buffer, 2048)) { $file .= $buffer; }

open UP,"> ./img_dir/sample.jpg";
print UP $file;
close UP;

これでアップロードできます。
    • good
    • 0
この回答へのお礼

解答ありがとうございます。

Linuxサーバーに上げるとうまくアップロードできました。ただ、windowsのloccalhostでテストするとアップってできないんでしょうか?
また、下の構文はどのような意味をあらわしているのでしょうか?
while (read($upimg1, $buffer, 2048)) { $file .= $buffer; }

ふと、ここで思ったのですが、
open UP,"> ./img_dir/sample.jpg";
とファイル名をsample.jpgではなくアップ元と同じファイル名にしたいのですが、可能なのでしょうか?

お礼日時:2005/05/22 11:25

> Linuxサーバーに上げるとうまくアップロードできました。

ただ、windowsのloccalhostでテストするとアップってできないんでしょうか?

可能ですよ。

open UP,"> ./img_dir/sample.jpg";
print UP $file;
close UP;



open UP,"> ./img_dir/sample.jpg";
binmode UP;
print UP $file;
close UP;

として下さい。
binmodeはUNIX系では無視されますのでそのままにしておいても構いません。

> また、下の構文はどのような意味をあらわしているのでしょうか?
> while (read($upimg1, $buffer, 2048)) { $file .= $buffer; }

readはファイルからデータを読み出す関数です。
読み出すファイルは$upimg1なので、それを2048バイトずつ読んで$bufferに入れます。あとはそれをEOFまで繰り返せばファイル全ての情報が$fileに格納されます。

> ふと、ここで思ったのですが、
> open UP,"> ./img_dir/sample.jpg";
> とファイル名をsample.jpgではなくアップ元と同じファイル名にしたいのですが、可能なのでしょうか?

もちろん可能です。

File::Basename と言うモジュールを使うと簡単にできます。
ファイル名は、
$FileName = basename($upimg1, "");
これで取り出す事ができます。

モジュールを使わないのであれば$upimg1にフルパスが格納されているので後はそれをsplit等を使ってやってご自分で分解して取り出して下さい。ただモジュールを使わない場合案外これが厄介です。クライアントのOSが限定されているのなら難しくないですが、全てのOSを考えると難しいです。
わたしはスクリプト内でファイル名を生成してやる方がはるかに簡単だと思いますが、特別な理由がない限り。
    • good
    • 0
この回答へのお礼

>binmodeはUNIX系では無視されますのでそのままにしておいても構いません。
localhostでアップできました。(激感動!!)

>readはファイルからデータを読み出す関数です。
>読み出すファイルは$upimg1なので、それを2048バイトずつ読んで$bufferに入れます。
>あとはそれをEOFまで繰り返せばファイル全ての情報が$fileに格納されます。
なるほど!!なぜ2048バイトかはわかりませんが、すばらしい!

>File::Basename と言うモジュールを使うと簡単にできます。
>ファイル名は、
>$FileName = basename($upimg1, "");
>これで取り出す事ができます。
ばっちりうまくいきました!!!
本当にうれしいです。
勉強になりました。
モジュール機能をいままで使っておらずこれほど簡単にできるのかとおもうと感動です。
PHPなみに楽になりますね!

お礼日時:2005/05/22 18:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!