Perl の CGI でファイルのアップロードが出来ない現象が発生しています。


簡単なフォームのページとそれを受け取る CGI でテストしているのですが、
いろいろ調べた結果、どうやら Perl のバージョンが 5.8 以降で起きているのか、
もしくは、Apache の設定関係のような気がします。

実際に調べたのは、

・Perl 5.6.1 + Apache 1.3.27(Vine Linux 2.6)
・Perl 5.8.0 + Apache 1.3.24(cygwin)
・Perl 5.8.0 + Apache 2.0.40(Redhat 9)

CGI.pm を使って、

$request = new CGI;
$file = $request->param(’file’)
もしくは
$file = $request->upload(’file’)
といったあたりは OK なのですが、$file から実際に read で読もうとすると
undef が返ります。

試しにと 5.6.1 にあった CGI.pm を使って 5.8.0 上で試しても現象は変わりま
せんでした。また、CGI プログラムから単純に標準入力を読み出してみたところ、
ファイルの中身は正しく送られているようです。

何かヒントがありましたらお教えください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:jkondo No.1

回答回数104ベストアンサー獲得回数4

ポイント4pt

form で、

enctype=”multipart/form-data”

といった指定が抜けていたりしないでしょうか。

id:JULY

それは何度も確認しました(^^;。

というか enctype が抜けてたら、Vine でもだめでしょう。

2004/05/26 11:40:15
id:kuippa No.2

回答回数1030ベストアンサー獲得回数13

ポイント33pt

>また、CGI プログラムから単純に標準入力を読み

>出してみたところ、ファイルの中身は正しく

>送られているようです。

一応念の為に確認させてください。

cgiのフォルダに対する書き込み権限はきちんと与えられていますか?

ユーザがファイルを作成するのではなく、cgiがファイルを作成することになります。一応確認でした。

5.6.1ではアップロードできるが、5.8.0だとできないという意味でしょうか?

5.6に付属したCGI.pmを5.8で動かそうとしていますか?

一応ぱーる最新版DLのリンクを貼っておきます。

http://www.harukaze.net/~mishima/perl/module/upload_by_CGI_pm.ht...

CGI.pmを使ったファイルのアップロードのサンプル

id:JULY

CGI のフォルダや CGI ファイル自体の権利関係は大丈夫だと思います。

動作状況をもう少し加筆すると、CGI.pm で取得したアップロードファイルのファイルハンドルに

対して読み込もうとすると中身が空、という状態です。CGi.pm がアップロードされたファイルを

一時ファイルに書き出すとすれば、その辺の権利関係の疑いはありますね。

正しく動作しない原因が Perl のバージョンによるものかは、まだ確証が得られていないのですが、

現時点では質問にも書いたとおり、5.6.1 が入っている Vine ではアップロードされた物が正しく

取得でき、5.8.0 が入っている cygwin、Redhat 9 では取得出来ない、ということです。

それと、CGI.pm に関連する話ですが、ものは試しと思って、Vine にあった CGI.pm を Redhat

に持ってきて試してもだめだった、というもので、元々 Redhat にある CGI.pm でもだめでした。

2004/05/26 13:22:31
id:nc_cls No.3

回答回数15ベストアンサー獲得回数0

ポイント33pt

既に試されているかもしれませんが、保存ディレクトリ

及びファイル自体のパーミッションをフルオープンにして

やってみるのはいかがでしょう?

あとURLに5.8.0で動作確認の取れているサンプルソースを

記載しておきますので、こちらでも試してみて下さい。

(ソース自体はEUC+LFです。)

id:JULY

動作していない所が、ファイルを書き出す所ではなくて、読み出し時なので、保存先には問題は無いの

ですが(実際、保存先の open には成功していて、

空のファイルが出来ている)、先の回答に対する

コメントでも書いたんですが、一時ファイルの作成場所によっては、という気がしています。

訳あって、動かないマシンのある場所から離れてしまったので、今は確認できないのですが、

その後、別の cygwin 環境で、Perl 5.8.2 でも正しく動作しました。となると、やはり動作環境

の問題かもしれませんね。

サンプルのソースまで提示していただきまして、ありがとうございました。拝見した結果、

やっぱり、自分のソースには問題無さそうです(^^;。

その後、さらに調べて見たのですが、CGI.pm が一時ファイルを正常に作成、オープンしている

のに、いざそのファイルに書き込みをしてみると、

中身が空のまま、という現象が見てとれました。

CGI.pm に手を入れて、読み出している部分を別のファイルに書き込んだらちゃんと保存できた

ので、どうも一時ファイルの読み書きの問題のようです。

これが、最初から一時ファイルの作成に失敗しているのなら、原因が究明できそうなんだけど、

ちゃんと CGI プログラムの実行ユーザ、グループ

がオーナーになった 0 バイトのファイルが作成

出来ているから謎(^^;。

とりあえず一度ここで終了します。

2004/05/27 17:01:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません