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バイトできちんとアップされていません。
本をみて自分なりにやってみたのですが・・・
どこがまちがっていますか?よろしくお願いします。
No.3ベストアンサー
- 回答日時:
> 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を考えると難しいです。
わたしはスクリプト内でファイル名を生成してやる方がはるかに簡単だと思いますが、特別な理由がない限り。
>binmodeはUNIX系では無視されますのでそのままにしておいても構いません。
localhostでアップできました。(激感動!!)
>readはファイルからデータを読み出す関数です。
>読み出すファイルは$upimg1なので、それを2048バイトずつ読んで$bufferに入れます。
>あとはそれをEOFまで繰り返せばファイル全ての情報が$fileに格納されます。
なるほど!!なぜ2048バイトかはわかりませんが、すばらしい!
>File::Basename と言うモジュールを使うと簡単にできます。
>ファイル名は、
>$FileName = basename($upimg1, "");
>これで取り出す事ができます。
ばっちりうまくいきました!!!
本当にうれしいです。
勉強になりました。
モジュール機能をいままで使っておらずこれほど簡単にできるのかとおもうと感動です。
PHPなみに楽になりますね!
No.2
- 回答日時:
> 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;
これでアップロードできます。
解答ありがとうございます。
Linuxサーバーに上げるとうまくアップロードできました。ただ、windowsのloccalhostでテストするとアップってできないんでしょうか?
また、下の構文はどのような意味をあらわしているのでしょうか?
while (read($upimg1, $buffer, 2048)) { $file .= $buffer; }
ふと、ここで思ったのですが、
open UP,"> ./img_dir/sample.jpg";
とファイル名をsample.jpgではなくアップ元と同じファイル名にしたいのですが、可能なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl/cgi リダイレクトができない
-
htmlからパラメータで、cgiに渡...
-
wordの数式について 定積分を書...
-
python subprocessに関する質問
-
cgiからsendmailを送信で文字化け
-
心理テストページをCGIで作りた...
-
perlで書いたcgiでsqliteの使い...
-
hiddenで送ったデータの取り出し方
-
FORMのselectの選択肢を最初か...
-
Mechanizeにおけるボタンクリッ...
-
何故横ナビ主流?
-
テキストBOXの縦幅を変えたい
-
CGI管理ページなどより背景画像...
-
横スクロールを縦スクロールに...
-
VBで表示したホームページの...
-
プルダウン&キーワードで
-
大和ネクスト銀行の銀行コード
-
select値をhiddenのvalueに渡し...
-
UTF-8で文字化けしないようにす...
-
ラジオボタンが両方とも選択で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlからパラメータで、cgiに渡...
-
metaタグについて
-
CGI経由でのPDFファイルをダウ...
-
sendmail 送信先を複数設定す...
-
perl/cgi リダイレクトができない
-
iis+cgiでmultipart/form-data...
-
フォントサイズを変えるには?
-
テキストエリアのインプットをP...
-
ホームページビルダーで作ったh...
-
cgi(perl) sendmailの使い方
-
CSVを読み込んでメニューを作成...
-
フォームメール(iモード用)で...
-
POST送信
-
CGIで~秒後にジャンプします。...
-
cgiについて教えて下さい。
-
CGI内でけいたいスマホの振り分け
-
CGIから表生成(1行に数件のデ...
-
ログファイルの編集についてお...
-
CGI
-
Yomi-Search追加機能で・・・
おすすめ情報