- 締切済み
添付つきメールフォーム:「an undefined value」エラーについて
はじめまして。添付機能付きのメールフォームを作成しているPerl初心者です・・・。 以下のようなエラーが出てしまうのですが、どなたかアドバイスをお願いいたします。 ★フォーム★ 添付部分は、type="file" name="file"です。 <form action="form.cgi" method="post" enctype="multipart/form-data">としています。 ----------------------- use CGI; $query = CGI->new; # 全てのパラメータ名を取得 @name = $query->param; foreach $name (@name){ $val = $query->param($name); push(@val,$val); $in{$name} = $val; } # ファイル処理 if ($in{'file'} ne "") { $fh = $query->upload('file'); $type = $query->uploadInfo($fh)->{'Content-Type'}; if ( $fh =~ /\w+\.\w+$/ ){ $filename = $&; }else{ $fh =~ /\w+$/; $filename = $&; } } --------------------- この処理で送信をすると、 「Can't use an undefined value as a HASH reference at :\www\home\information\pressform.cgi line 78.」 とエラーになってしまいます。 line 78は、「$type = $query->uploadInfo($fh)->{'Content-Type'};」の部分です。 $filename、$type、$fhを表示させるとそれぞれ値は出ているようなんですが・・・。 例) $filename:photo_depp_img4.jpg $type:image/pjpeg $fh:C:\Documents and Settings\oh_hp\デスクトップ\photo_depp_img4.jpg $queryは、CGI=HASH(0x1b0f41c)と表示されます。 ・確認画面まではうまく表示されます。 ・添付ファイルをつけなければ、上記エラーはでないで送信完了画面までいきます。 上記エラーになる原因はなんでしょう?? どなたかお教えください!よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- qtea
- ベストアンサー率77% (38/49)
少し気になったのでNo1を補足します。 $fhにundefが入っているならば、$fhにundefが入る理由として、 ・<input type="file" name="file">のname="file"になっていない。 が思いつきますが… >添付部分は、type="file" name="file"です とあるので、違うでしょうね…。 実は一番気になるのが、 >・確認画面まではうまく表示されます という部分です。 処理は以下のような感じなのでしょうか? 1.アップロード付メールフォーム (ここでファイルをアップロード) 2.確認画面 (ここではファイル名を出力して、アップロードは行っていない) 3.メール送信処理 だとすると、「2.確認画面」後に、 $fh = $query->upload('file'); としているならば、うまくいきません。 この流れで組むのならば、確認画面を出力する前(1のあと)に、一度、アップロードしたファイルを保存して、3でその保存したファイルを添付してメールで送るようにしないと、うまくいかないと思います。 (もしくは、上のときに、メール内容を全部、そのままメールで送れる形にして、保存しておくとか) ただ、この場合、いろいろと考慮しないと問題が発生する可能性がでてきます。 例えば、 ・2の確認画面にhiddenで一時保存したファイルを特定する為の情報が必要になる 下手にファイル名を付加しておくと、セキュリティ上、問題がある(その値を変えることで、重要なファイルがメールで送られてくる可能性も…) ・保存したファイルをいつ削除するのか? などです。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
> if ($in{'file'} ne "") { > $fh = $query->upload('file'); > $type = $query->uploadInfo($fh)->{'Content-Type'}; ではなくて if ($in{'file'} ne "") { $fh = $query->upload($in{'file'}); $type = $query->uploadInfo($in{'file'})->{'Content-Type'}; になるのではないでしょうか。
- qtea
- ベストアンサー率77% (38/49)
$fh = $query->upload('file'); ここで、$fhの値が、undefになっているのではないでしょうか? $fh = $query->upload('file'); unless(defined $fh){ print "Content-type:text/html\n\n"; print "fhがundef!"; } のようにして、値の確認をしてみてはどうでしょうか?
お礼
taloo様 qtea様 アドバイスありがとうございます!! 思い当たるふしがたくさんです・・・。 困り度3にしていたのですが、結局フォームは使用しないことになりました↓↓ でも個人的に気になるので、アドバイスいただいた部分を直して試してみたいと思います。 全体の流れは、qtea様の予想通りの順番です。 フォーム処理($fh = $query->upload('file'); )の部分は、デコードのサブルーチンの中で行ってその後確認画面の表示にしていますが、確認画面ではアップロードしてませんでした。。。 取り急ぎお礼まで。 また、結果がでたらご報告します。