人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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 プログラムから単純に標準入力を読み出してみたところ、
ファイルの中身は正しく送られているようです。

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

●質問者: JULY
●カテゴリ:ウェブ制作
✍キーワード:2.0 24 Apache CGI cygwin
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● こんどう
●4ポイント

form で、

enctype=”multipart/form-data”

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

◎質問者からの返答

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

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


2 ● くいっぱ
●33ポイント

http://www.accessup.org/cgi/attribute.html

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

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

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

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

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

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

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

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

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

http://homepage1.nifty.com/typhoon/at-cgi/so_path.html

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

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

http://use.perl.org/articles/04/01/16/189250.shtml

use Perl | Perl 5.8.3 Released

http://kinsan.main.jp/wiki/wiki.cgi/jhkFarm?page=install+CGI.pm

◎質問者からの返答

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 でもだめでした。


3 ● nc_cls
●33ポイント

http://bottleneck.jp/sample/up.txt

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

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

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

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

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

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

◎質問者からの返答

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ