• 締切済み

ファイルのアップローダーを動作させたい。

ファイルをサーバーへ格納するプログラムを検索して作成しました。 見よう見まねなのでおかしい部分があるかもしれません。 entry.cgi #!/perl/bin/perl my $buffer; my $query = CGI->new; my $fh = $query->upload('file') or die(qq(Invalid file handle returned.)); # Get $fh my $file = $query->param('file'); my $file_name = ($file =~ /([^\\\/:]+)$/) ? $1 : 'uploaded.bin'; open(OUT, ">$file_name") or die(qq(Can't open "$file_name".)); binmode OUT; while (read($fh, $buffer, 1024)) { # Read from $fh insted of $file print OUT $buffer; } close OUT; sample.html <HTM><BODY> <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="./entry.cgi"> <TABLE BORDER="1"> <TR><TD ><B>CSVファイル</B></TD> <TD ><INPUT TYPE="FILE" NAME="filename"></TD></TR> <TR></TR> </TABLE> <BR> <BR> <INPUT TYPE="SUBMIT" NAME="GO" VALUE=" 登録の実行 "> </FORM> </BODY></HTML> 上記のプログラムを実行すると 「CGIWrap Error: Script Execution Failed」と表示されてしまいます。 500のサーバーエラーと同じと調べてわかったのですが、どこがどうおかしいのか?わかりません。 perlの記述が今まで自分が使用していたものと勝手が違うので分からない状態です。 アドバイスもらえると幸いです。

  • Perl
  • 回答数4
  • ありがとう数1

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

アップしたファイルを保存するディレクトリのパーミッションが、書き込み可能になっていますか? html や cgi を置くディレクトリのパーミッションは、書き込み権限を落としてあることが多いように 思います。その場合は、open(OUT, ">$filename") ... の行で失敗します。

hihin2003
質問者

お礼

回答ありがとうございます。 パーミッションは書き込み可能となってます。 確かに書込み禁止としていたら書き込みで失敗しますね。 その場合でもcgiエラーの500が出るのでしょうか?

回答No.3

気付いた点を何点か (1) <HTM> sample.htmlの<HTM>は<HTML>が正しいと思います。 (2) #!/perl/bin/perl 環境にもよりますが、このパスは合っていますか? (3) CGIアップロード有効 これも(2)と同様に環境によりますが、デフォルトでアップロードが 無効になっていることがあります。 CGI->newの前に $CGI::POST_MAX = 1024 * 1024; $CGI::DISABLE_UPLOADS = 0; などの設定が必要な場合があります。 (4) ヘッダの出力 これは本質でないですが、大抵CGIプログラムはhtmlヘッダを出力する 必要があります。CGIで何も出力する必要がなくても、htmlヘッダを 出力しないと、Webサーバがエラーを出す場合があります(これも 環境によります)。例えば、処理の最後に print $query->header("text/plain"); としておいた方がエラーを拝まなくて済むことがあります。

hihin2003
質問者

補足

回答ありがとうございます。 >(1) <HTM> >sample.htmlの<HTM>は<HTML>が正しいと思います。 そうですね。申し訳ございません。修正いたしました。 >(2) #!/perl/bin/perl >環境にもよりますが、このパスは合っていますか? はい。あっています。 >(3) CGIアップロード有効 >これも(2)と同様に環境によりますが、デフォルトでアップロードが >無効になっていることがあります。 >CGI->newの前に >$CGI::POST_MAX = 1024 * 1024; >$CGI::DISABLE_UPLOADS = 0; >などの設定が必要な場合があります。 ありがとうございます。修正いたしました。 >(4) ヘッダの出力 >これは本質でないですが、大抵CGIプログラムはhtmlヘッダを出力する >必要があります。CGIで何も出力する必要がなくても、htmlヘッダを >出力しないと、Webサーバがエラーを出す場合があります(これも >環境によります)。例えば、処理の最後に >print $query->header("text/plain"); >としておいた方がエラーを拝まなくて済むことがあります。 ありがとうございます。 ここに書かれている内容を修正して実行したのですが変化がありませんでした。 本来は、この内容で動作するものなのでしょうか? perlで作成しているのですが、すっかりわからなくなってしまいました。

回答No.2

プログラム内ではfileという名前でデータを受け取っていますが、 HTML側はfilenameになっています。 プログラムに合わせるのであれば <INPUT TYPE="FILE" NAME="filename"> ↓ <INPUT TYPE="FILE" NAME="file"> ですね。

hihin2003
質問者

補足

回答ありがとうございます。 htmlのソース修正いたしました。 しかし、まだ「CGIWrap Error: Script Execution Failed」の表示がされたまとなっています。

回答No.1

entry.cgiでuse CGI;が抜けています。 #!/perl/bin/perl my $buffer; ↓ #!/perl/bin/perl use CGI; my $buffer; としてみて下さい。

hihin2003
質問者

補足

回答ありがとうございます。 早速対応いたしました。 「CGIWrap Error: Script Execution Failed」と表示が変わりませんでした。 何か必要なモジュールがあるのでしょうか? perlのバージョンは5.8.8になります。

関連するQ&A

  • バイナリファイルのアップロードに関して

    今回質問させて頂くことに関連した問題を、現在MySQLのカテゴリで質問させていただいているのですが、 バイナリファイルをアップロードし、そのファイルのバイナリデータを変数($img)に格納し、それをDBに格納するという形を目指しています。しかし、DBにどうしても格納できません。もしやバイナリデータを変数に格納する時点で、既におかしいのかと思いまして、その部分についてこちらでご教授頂きたく書き込ませていただきました。 #!C:\Perl use CGI; use DBI; $PCMOJPATH='C:\パス名'; #ディレクトリ指定 my ($buffer); my $query = new CGI; $uniqid = time . "_" . $$; $newfile = "upload_$uniqid"; #ファイル名 print "Content-type: text/html\n\n"; print "<html><body>\n"; my $fH = $query->upload('filename'); my $mimetype = $query->uploadInfo($fH)->{'Content-Type'}; open (OUT, ">$PCMOJPATH/$newfile"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; $img .= $buffer;   #バイナリデータを$imgに格納 } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); chmod (0666, "$PCMOJPATH/$newfile"); ------------------------- と書いているのですが、$imgにはバイナリデータがちゃんと入っていないのでしょうか?間違っているところがあれば、どのように直したらいいか教えてください。どうぞよろしくお願いします。

  • perlで文書を読み込み検索置換したい

    MAC OS Xを使用しています。 検索置換のプログラムをperで作成し、Applescript上で呼び出したいのです。 実際はファイルメーカーのスクリプトの中でApplescriptを記述してその中で呼び出したいのです。 do shell script "perl ~.pl"という感じで使えるのではないかと 下記のようなサンプルスクリプトを見つけたのですが 内容の更新の仕方がよく分かりません。 perlについては全くの初心者でいろいろ調べたのですがよく理解できませんでした。 検索置換したいのですが、どういうふうに書けばいいのでしょうか。 (2)の部分を教えて下さい。宜しくお願いします。 use strict; use warnings; use File::Copy 'move'; # (1) ファイルの内容を読み込む my $file = 'F:\共有\PERL\test.txt'; open my $fh, '<', $file or die qq/Can't open file "$file": $!/; my $content = do {local $/; <$fh>}; close $fh; # (2) 内容の更新 ▼をリターンに置き換えたいのです。 $line =~s/▼/\n/; # (3) 一時ファイルへの書き出し my $temp_file = "$file.$$." . int(rand 10000); open my $temp_fh, '>', $temp_file or die qq/Can't open file "$file": $!/; print $temp_fh $content; close $temp_fh or die qq/Can't open file "$file": $!/; # (4) 一時ファイル名を元のファイル名に変更 move $temp_file, $file or die qq/Can't move "$temp_file" to "$file": $!/;

  • perlでCSV形式ファイルのアップロード方法

    perlでCSV形式ファイルのアップロード方法を教えてさい。 htmlで <HTML> <BODY> <FORM action="excel読み込み.cgi" enctype="multipart/form-data" method="post"> フレアシステムのファイル: <INPUT type="file" name="upload_file" size="60"><BR> <INPUT type="submit" value="読み込み"> </FORM> </BODY> </HTML> として、ファイル名の指定をして、読み込みボタンを押すと、excel読み込み.cgiを呼び出すのですが、プログラムの内容が表示されるだけで終わってしまいます。 excel読み込み.cgiのプログラムは以下の内容です。 #! c:/perl/bin/perl use CGI; $query = new CGI; $filename = $query->param('upload_file'); while(read($filename, $buffer, 2048)) { $file .= $buffer; } @files = split(/\\/, $filename); ($basename, $exp) = split(/\./, $files[-1]); $new_file = $basename . "." . $exp; # ファイルを指定ディレクトリにコピー #open(OUT, "> c:\\foo\\$new_file"); open(OUT, "> c:\\$new_file"); binmode(OUT); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "[$basename] [$exp]\n"; print "正常終了\n"; exit; CGIのプログラムを色々と調べて、別のないようにしても同じようにプログラムがそのまま表示されてしまいます。 どなたか教えてください。 宜しくお願いします。

  • ファイルをアップロードするCGI

    ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";

  • 画像ファイルをアップロードする方法

    掲示板を作りました。 画像ファイルやpdfファイルをアップロードできる 機能もつけたいと思います。 まずは保存方法なのですが、本で下のようにつく ってみました。 書き込み部分↓ use CGI qw(:standard); $file = param('file'); open OUT, "> $file"; while ( <$file> ) { print OUT $_; } フォーム部分↓ <FORM method="POST" enctype = "multipart/form-data" action="write.cgi"> <TR> <TD valign="top" width="116">■メッセージ(※)</TD> <TD colspan="3" width="371"><TEXTAREA rows="10" cols="50" wrap="soft" name="message">$message</TEXTAREA></TD></TR> <TR> <TD valign="top" align="right" colspan="2"><INPUT TYPE="file" NAME = "file" size ="50"></TD> </TR> </TABLE> <INPUT TYPE=HIDDEN NAME=time VALUE="$time"> <INPUT TYPE=HIDDEN NAME=mynum VALUE="$mynum"> <INPUT type="submit" value=" 送 る "> <INPUT type="reset" value="やり直す"> 上記のようにやったら内部エラーが出てしまいました。 サーバーはぷららの http://www.plala.or.jp/access/community/phps/ucgi_main.html を利用しています。 use CGI; がいけないのでしょうか?

    • ベストアンサー
    • Perl
  • perlでCSV形式ファイルのアップロード

    本日、同じ質問をしたものです。 前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。 CGIのプログラムは以下のソースです。 #! c:/perl/bin/perl use CGI; # CGIヘッダーの出力 print "Content-type: text/html\n\n"; my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./a.csv"); binmode(OUT); while(read($fileName,$buffer,1024)) { print OUT $buffer; } close(OUT); close($fileName); #ファイルハンドルをcloseしています。 exit ; ファイルは、作られるのですが、中身が書き込まれません。 どなたか教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • ファイル名でなく、ファイルの中身を保存したい

    テキストと画像を回答するHTMLで書かれたアンケートがあります。回答は、 <form name="a" method="post" action="cgitest.cgi" enctype="multipart/form-data"> つまり、POSTメソッド、multipart/form-dataモードで cgitest.cgi に回答を送ります。 perlで作成したCGIでテキストは正しく受信できましたが、画像がファイルの中身ではなくファイル名になってしまいます。画像ファイルを受信する方法を教えてください。 なお、CGIには、画像ファイルのバイナリデータも送信されていることは、別途C言語で記載した確認プログラムで確認済みです。 ----HTML---- <!DOCTYPE html> <html lang="ja-JP"> <head> <meta charset=Shift_JIS> </head> <body> <form name="a" method="post" action="cgitest.cgi" enctype="multipart/form-data"> 氏名 : <input type="text" name="ans1"> 困ったときの写真:<input type=file name="ansfig1" onChange="this.form.disp.src=window.URL.createObjectURL(this.files[0])"> <br><img name=disp> <input type="submit" value=" 送信 "> <input type="reset" value=" 取消 "> </form> </body> </html> ----CGI----- #!"D:\lib\xampp\perl\bin\perl.exe" use CGI; my $q = new CGI; #フォームからのデータ読み込み my $ans1 = $q->param('ans1'); my $fig1 = $q->param('ansfig1'); $ans1file = 'ans1.txt'; open(OUT, ">$ans1file") or die "$!"; print OUT $ans1; $ans2file = 'ans2.jpg'; open(OUT, ">$ans2file") or die "$!"; print OUT $fig1; ---- 参考 CGIに渡されるデータ確認用 --------- #include <stdio.h> #include <fcntl.h> #include <io.h> int main(void) { int c; FILE *fp; fp = fopen("temp.dat","wb"); setmode(fileno(stdin), O_BINARY); while((c=fgetc(stdin)) != EOF ) { fputc(c,fp); } fclose(fp); return 0; }

    • ベストアンサー
    • CGI
  • PHP 画像アップローダー作成について

    PHPの勉強をしている者です。 ローカル環境(XAMPP1.7.3)にて、画像アップローダーを動かそうと試みています。 が、一時ファイル名が取得できず、失敗に終わります。初歩的なミスかもしれません。 -------------------- 【upload.html】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <h1>画像ファイルアップロード</h1> <p>アップロードする画像ファイル(JPEG形式)を選択して「アップロード」ボタンを押してください。</p> <form action="upload_image.php" method="POST" enctype="multipart/form-data"> <table> <tr> <th>画像ファイル選択</th> <td><input type="file" name="filename" size="50"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="アップロード"> </td> </tr> </table> </form> </body> </html> -------------------- 【upload_image.php】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>画像ファイルアップロード</title> </head> <body> <h1>アップロードファイル情報</h1> <p> <?php // ファイル名の取り出し $file_name = $_FILES['filename']['name']; // ファイル(MIME)タイプの取り出し $file_type = $_FILES['filename']['type']; // 一時ファイル名の取り出し $temp_name = $_FILES['filename']['temp_name']; // エラーコードの取り出し $upload_error = $_FILES["filename"]["error"]; // 保存先のディレクトリ $dir = 'uploads/'; // 保存先のファイル名 $upload_name = $dir . $file_name; // JPEG形式のファイルをアップロードする if (($file_type == "image/jpeg") || ($file_type == 'image/pjpeg')) { // アップロード(移動) $result = move_uploaded_file($temp_name,$upload_name); if ($result) { // アップロード成功時 echo '■アップロード成功'; } else { // アップロード失敗時 echo '■アップロード失敗'; } } else { // JPEG形式以外のファイルはアップロードしない echo '■JPEG形式の画像をアップロードしてください。'; } ?> </p> <table> <tr> <td colspan="2"><img src="<?php echo $upload_name; ?>" alt=""></td> </tr> <tr> <th>エラーコード</th> <td><?php echo $upload_error; ?></td> </tr> <tr> <th>画像ファイル名</th> <td><?php echo $file_name; ?></td> </tr> <tr> <th>MIMEタイプ</th> <td><?php echo $file_type; ?></td> </tr> <tr> <th>一時ファイル名</th> <td><?php echo $temp_name; ?></td> </tr> </table> </body> </html> -------------------- 【php.iniの一部】 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. ; http://php.net/file-uploads file_uploads = On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir upload_tmp_dir = "C:\xampp\tmp" ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 128M -------------------- このように作っております。 結果は エラーコード→0 画像ファイル名→正常取得 MIMEタイプ→正常取得 一時ファイル名→空 どのような原因が考えられるか、教えて頂ければ幸いです。

    • ベストアンサー
    • PHP
  • アップローダがうまく作れない

    アップローダを作成しています。 しかしなぜか受け取る側の.plでファイルが見つからず、開けません。 HTMLと.plのソース付けときますので間違えの指摘お願いします <table border="0"> <form action="./UpShori.pl" method="post"> <tr><th><Div Align="right">アップするファイル</th><th><Div Align="left"><input type="file" name="file" size="39"></th></tr> <tr><th><Div Align="right">ファイルの説明</th><th><Div Align="left"><input type="text" name="setumei" size="50" maxlength="45"></th></tr> </table><br> <input type="submit" value="アップロード"> --受け取るUpShori.pl--- #!c:/Perl/bin/Perl.exe print"Content-type: text/html\n\n"; $Data; @DataBunkai; $UpFileName; @UpFileData; read(STDIN,$Data,$ENV{'CONTENT_LENGTH'}); @DataBunkai = split("=","$Data"); @DataBunkai = split("&","$DataBunkai[1]"); $UpFileName=$DataBunkai[0]; # ここで”ファイルがありません”と出力される open(READ,"<","$UpFileName") or die print"ファイルがありません"; @UpFileData=<READ>; close(READ); # ↓の生成されるファイル名は気にせずお願いします。 open(WRITE,">","0000"); print WRITE"@UpFileData"; close(WRITE); print<<End_Of_Program; End_Of_Program

    • ベストアンサー
    • Perl
  • Perlでの一括アップロード

    同じファイルを違うファイル名で一括でアップロードしたいのですが。 最初の一つしか正常にアップされません。 残りのファイルは正しいファイル名で作成はされるのですが、0バイトの状態です。 原因としてはファイルを書き込む Whileの中のprintしている部分かと思われます。 ちなみにバイナリデータも取得できています。 *このソースはファイルのアップ部分だけで、 実際にはforeachの中で関数として呼ばれています。 エラー関数や、モジュールの呼び出し部分は省略しています。 仕様モジュールCGI.pm ソースは以下のとおりです。 ご教授の方よろしくお願いいたします。 # 最大許容サイズ(KByte) my $maxsize = 300; # 保存先ディレクトリ my $logfiles = "./file"; # アップロードを許可するファイルの種類 my %hash_mime = ( 'text/html' => 'html', 'image/jpeg' => 'jpg', 'image/pjpeg' => 'jpg' ); # ファイル取得 my $fH = $query->upload('filename'); # エラーチェック if ($query->cgi_error) { my $err = $query->cgi_error; &error("$err") if ($err); } &error("File transfer error.") unless (defined($fH)); # MIMEタイプ取得 my $mimetype = $query->uploadInfo($fH)->{'Content-Type'}; # 保存するファイル名を取得 my $set = &set_name($mimetype); # ファイル保存 my ($buffer); open (OUT, ">$logfiles/$set") || &error("Can't open $set"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); chmod (0666, "$logfiles/$set");

    • ベストアンサー
    • Perl