ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

超初心者向けCGI講座コミュの【質問】CGIメールフォーム 添付について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。添付機能付きのメールフォームを作成している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)と表示されます。

・確認画面まではうまく表示されます。
・添付ファイルをつけなければ、上記エラーはでないで送信完了画面までいきます。

上記エラーになる原因はなんでしょう??
どなたかお教えください!よろしくお願いします。

コメント(4)

上記コードで、問題なく動作しました。

ただ、
$test = CGI->new;
$query = CGI->new;
のようにオブジェクトを2回生成したら、まったく同じ場所で同じエラーがでました。
バカ正直にエラーを追うとすれば

use Data::Dumper;しておいて、

print Dumper($query->uploadInfo($fh));してみたときの
ハッシュの値にContent-Typeが含まれるかどうかが肝と思います。


れいさんの書かれている通りのことがここらへんでやりとりされてますが、参考になるでしょうか・・・?

http://chaichan.hp.infoseek.co.jp/qa4000/qa4373.htm

提示されたソースの部分は一部なので、該当部分は間違いなく提示部の78行目ではないでしょうから、その前にCGI->newしている部分があるのかもしれないですね。
れい様・KIDD様 レスありがとうございます!!

早速「use Data::Dumper; 〜」を試してみました。
----結果----------
$VAR1 = { 'Content-Disposition' => 'form-data; name="file"; filename="C:\\Documents and Settings\\oh_hp\\デスクトップ\\photo_depp_img4.jpg"', 'Content-Type' => 'image/pjpeg' };
-------------------
これによって何がわかったのかも分からない初心者なので、引き続きアドバイスいただけるとありがたいです。

★1行目〜デコード部分までを貼ってみます★★★★★★
#!/usr/local/bin/perl

# ライブラリー取り込み
require './jcode.pl';
require './mimew.pl';

# sendmailパス *テスト環境!
$sendmail = 'c:\sendmane\sendmane.exe';

# 送信先アドレス
$mailto = '*****';

# 送信メールタイトル
$subject = '********';

#-------------------------------------------------------
# メイン処理
#-------------------------------------------------------

# フォームデコード
&decode;

# メール送信
if ($in{'mode'} eq "sendmail") {

if ( $in{'file'} eq "" ){ &sendmail;}
else{ &filesend; }
}

# 確認画面
&preview;

#-------------------------------------------------
# フォームデコード
#-------------------------------------------------
sub decode {

# CGI.pmモジュール使用
use CGI;
$query = CGI->new;

# 全てのパラメータ名を取得
@name = $query->param;

foreach $name (@name){
$val = $query->param($name);

# エスケープ
$val =~ s/&/&/g;
$val =~ s/"/”/g;
$val =~ s/</</g;
$val =~ s/>/>/g;

# 改行→タブ 変換
$val =~ s/\r\n/\t/g;
$val =~ s/\r/\t/g;
$val =~ s/\n/\t/g;

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 = $&;
}
}
}
★★★★★★★★★★★★★

という感じです・・・。
ちなみに【メイン処理】の「メール送信」と「確認画面」の順番を逆にすると、添付ファイルを付けない場合でも確認画面で送信ボタンを押すと再び確認画面が表示される(リロードしたような感じ)という動きになってしまいます・・・(>△<)??

いろいろ分からない事ばかりですが、よろしくお願いします。
はじめまして。
下記の内容で伝わればいいのですが。。。
分かりやすくするために全角スペースを
入れていますので御了承ください。

A 流れの中で処理の終了をする場合
  終了を指定しないといけません。

# メール送信
if ($in{'mode'} eq "sendmail") {
  if ( $in{'file'} eq "" ){
    &sendmail;
    exit; # 追加
  }
  else{
    &filesend;
    exit; # 追加
  }
}

# 確認画面
&preview;
exit; # 追加


B 確認画面を表示するときは
  違うモードを指定するとか。。。

# メール送信
if ($in{'mode'} eq "sendmail") {
  if ( $in{'file'} eq "" ){
    &sendmail;
  }
  else{
    &filesend;
  }
} else {
  # 確認画面
  &preview;
}

exit; # 追加

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

超初心者向けCGI講座 更新情報

超初心者向けCGI講座のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング