こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

POST形式でファイルを送ると、CGIモジュールでエラーが出ます。

ファイルを添付できるメールフォームを作ろうと思いました。

まず呼び出し側のHTMLファイルを以下のようにしました。
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>

  <body>
  <form action="./filemail.cgi" method="post" enctype="multipart/form-data">
   <input type="file" name="file-1"><br />
   <input name="submit" type="submit" value="送信">
  </form>
  </body>
  </html>

しかし受け手のCGIの方でエラーが出ます。

エラー原因を調べるためプログラムのコードをとことんまで削りました。
  #! usr/bin/perl -d
  
  use strict;
  use warnings;
  use CGI::Carp qw(fatalsToBrowser);
  use CGI;
  
  our $q=new CGI; ・・・A
  
  print $q->header(-charset=>'utf-8'),
     $q->start_html(-charset=>'utf-8',
            -lang=>'ja-JP'),
     "うまくいった~~^^v\n",
     $q->end_html;

それでもエラーが出ます。エラー箇所はAの
our $q=new CGI;
です。

エラーメッセージは
  Software error:
  CGI open of tmpfile: No such file or directory
です。

ちなみにコードを削りまくったこのプログラムはフォームデータとまるで関係ないので、ブラウザのURL窓にURLを手入力して呼び出してみました。
 http://127.0.0.1//filemail.cgi

これは目出度く正常に動作します。
 うまくいった~~^^v

またファイルを添付せずにフォームの送信ボタンをクリックしても正常に動作します。
そしてファイルを添付しても、フォームの送信方法をPOSTではなく、GETにしたら正常に動作します。

要するに、フォームの送信方法がPOSTの場合に、ファイルを添付して送信ボタンをクリックすると前述のエラーが出ます。

エラーメッセージからしてCGIモジュールで何か問題が起きているのですが、CGIモジュールとPOSTによるファイル送信は相性が良くないのでしょうか。それとも何か他にやるべきことがあるのでしょうか。

お手数をお掛けします。

投稿日時 - 2009-07-26 20:47:38

QNo.5157687

すぐに回答ほしいです

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

> CGI open of tmpfile: No such file or directory

このエラーメッセージを頼りに CGI.pm のマニュアルを見てみると...

http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod#item__private_tempfiles

これに沿って、一時ファイルディレクトリを指定してみてください。

投稿日時 - 2009-07-27 00:39:11

お礼

TMPDIR変数に
 /usr/bin
のパスを通したらうまく作動しました。

ありがとうございます。

一応私もCGI.pmのPODは見ようとしたのですが、PPMからCGIを選択し、その詳細にあるURLをクリックしたら、CGIのPODであるはずリンク先がCGI::何たらのリンク集になってて、そのリストが808もあり、大江戸八百八町じゃあるまいしと検索をそこであきらめていました。今日改めてPPMを覗いてみると、検索窓にCGIと入れれば、ちゃんとCGI.pmのPODが出てきますね。あるいはアメリカ版googleを使って検索を掛けても、CPANの方のPODがヒットしました。

日本語版のサイトも教えてもらいましたし、今回、直接的にプログラムが動いたという事実よりも、そういったことの方が収穫が大きいと思います。

どうもありがとうございました。

投稿日時 - 2009-07-27 10:34:55

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

初心者並みの者ですが、次のところを直すとどうでしょう。
スクリプトの先頭行 #!/usr/bin/perl にしてみる。
-d スイッチは付けない。
付けるなら -w スイッチ。そうすると、 our $q=new CGI; は my $q=new CGI; で良い。

投稿日時 - 2009-07-27 01:05:13

お礼

ありがとうございます。

-dスイッチを付けたままブラウザで起動すると普通エラーが出ます。でも私の場合、サードパーティのデバッガを使っていて、その仕様上、-dスイッチを付けたままスクリプトをブラウザで起動するとデバッガが起動するようになっています。

いらぬご心配をかけぬよう、-dスイッチは外してスクリプトを上げれば良かったですね。

ありがとうございました。

投稿日時 - 2009-07-27 10:43:32

あなたにオススメの質問