• ベストアンサー

ファイルアップローダーについて

Perlを使用してCGIのアップローダーを作成しています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1177414 の続きなのですが、Web上にあるコードを持ってきて、自分なりに変更してみました。 上記のものだと、ラジオボタンがないので、そこを追加して、さらに拡張子に何がくるかわからないので下記のようにして拡張子を求めました。 ################## # 拡張子を求める # ################## $filename = $in{'upfile'}; $substrings = "."; $position = rindex $filename, $substrings; $file_type = substr($filename, $position); $fnme = $fnme . $file_type; # 受信データを書き込む open OUT,">$fnme"; binmode OUT; print OUT $in{'upfile'}; close OUT; $mes = '書き込みが完了しました。'; 無事拡張子も出て、「sample.***」という感じでアップロードできたのですが、アップロードできたこのファイルを開こうとすると、 gifは「種類を特定できません」、bmpは「このファイルは読み取れません。このビットマップファイルは無効であるか、または現在サポートされていない形式です」 と出てしまいました。 こんな風に拡張子を取得したのではダメなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

enctype="multipart/form-data" がないと、ファイルの実体はサーバに送信されませんので消してはダメです。 radioボタンの受け取りは元のソースにはない部分でもあるし、追加したであろうその部分に問題があるかと思います。 また、enctype="multipart/form-data"を付けると、$in{'upfile'}にはアップロードしたファイルの実体が格納されてきますので、ファイル名は元ソースのように @in から求める必要があります。

w-inty
質問者

お礼

回答ありがとうございます。 金曜は焦っていたんだなぁと自分でも文章を見て思います(笑 以下のようにしてみました。 htmlの文章 <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>アップロード</TITLE> </HEAD> <BODY> <FORM method="POST" action="2.cgi" enctype="multipart/form-data"> <INPUT TYPE=RADIO NAME="folder" VALUE="a">a <BR> <INPUT size="40" type="file" name="upfile"> <INPUT type="submit" value="送信する"> </FORM> </BODY> </HTML> cgiの方で@inをprintで見てみると Content-Disposition: form-data; name="folder" Content-Disposition: form-data; name="upfile"; filename="*****\mark.gif" Content-Type: image/gif と出てきました。 こうするとラジオボタンの中身は入ってこないですよね? ラジオボタンのデータを取得するにはどうしたらいいのでしょうか? 通常のcgiだと上記のようにすれば取得できると思うのですが…。 またcgiの中の拡張子を取得する箇所で if ($tmp =~ /(.*)Content-type:(.*)/i){ と if ($2 =~ /image\/jpeg/i) { $ext = '.jpg'; } という表記がありますが、意味はなんとなくわかりますが、コードの意味がイマイチわかりません。

w-inty
質問者

補足

無理やりな方法ですが、自分なりに考えて長々とコードを書いて、無事完成させることができました! 人がみたら変なコードだと思いますが、自分で考えたコードなのでちょっとうれしいです(^^) 教えていただいてありがとうございました。

その他の回答 (1)

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

$in{'upfile'}はファイル名の情報用のだけで、ファイルの中身(バイナリデータ)は、入っていないのでしょう。(そもそも混在させているというのはありえないので) 試しにアップロードされたファイルをテキストエディタなりバイナリエディタなりで開いて確認してみましょう。 「Web上にあるコードを持ってきて、自分なりに変更してみました」だけでかつ上記のソースコードの提示だけではこれしか答えられません。

w-inty
質問者

お礼

回答ありがとうございます。 ためしに開いてみたところ、パスとファイル名のみが表示されました…。 >「Web上にあるコードを持ってきて、自分なりに変更してみました」だけでかつ上記のソースコードの提示だけではこれしか答えられません。 質問文にもかいてあるのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1177414 の続きなのです。 何度もURLを載せるのも悪いかなと思い、今回は載せませんでしたが、実際のコードは http://www.aimix.jp/cgi/acccgilibupfile.html です。 ここには、それぞれの拡張子についてのif文があるのですが、どんな拡張子でも載せられたら、と思い 質問文のように変更してみたんですが、変更の仕方が悪かったんですね。

w-inty
質問者

補足

変更箇所はこんなところです。 <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">             |             |             ▽ <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> (参考にしたサイト様でラジオボタンを使ったフォームの箇所に2行目が書いてあったので、こうしたらつくのかなぁ?とか思い付け足してみる) あと、これがいけないのかなぁ?と思うのは <FORM method="POST" action="./test.cgi" enctype="multipart/form-data"> を <FORM method="POST" action="./test.cgi"> としたことです。 画像などのデータを送る場合は…と書いてあるのでこれを消してしまうとダメなのかと。。 でも <FORM method="POST" action="./test.cgi" enctype="multipart/form-data"> としてしまうとラジオボタンのデータがうまく受け渡しできないのです。 上記のものを消すとなぜかうまくいって。 でもこれが原因のような気がしてなりません。

関連するQ&A

専門家に質問してみよう