• ベストアンサー

Perl使用のアップローダーで、jpgだけアップロードできない。

●フォームのcgiは ---------- print "Content-type:text/html\n\n"; print "<FORM method='POST' action='2.cgi' enctype='multipart/form-data'>\n"; print "<INPUT size='40' type='file' name='upfile'> \n"; print "<INPUT type='submit' value='送信する'>\n"; print "</FORM>\n"; ---------- ●実際のcgiは ---------- require './cgi-lib.pl'; print "Content-type:text/html\n\n"; #フォームからのデータを受け取る &ReadParse; #ファイル名を指定する $fnme = 'sample'; ################## # 拡張子を求める # ################## $substrings1 = "\\"; $ichi = rindex $in[1], $substrings1; $search_moji = substr($in[1], $ichi); $substrings2 = "."; $substrings3 = "\""; $start_position = index $search_moji, $substrings2; $start_position = $start_position; $finish_position = index $search_moji, $substrings3; $moji_count = $finish_position - $start_position; $file_type = substr($search_moji,$start_position,$moji_count); $fnme = $fnme . $file_type; # 受信データを書き込む open OUT,">$fnme"; binmode OUT; print OUT $in{'upfile'}; close OUT; $mes = '書き込みが完了しました。'; #完了メッセージ print <<"HTML"; Content-type: text/html <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </HEAD> <BODY> $mes </BODY> </HTML> HTML exit; ---------- です。 txt、bmp、gif、xlsはテストしたところちゃんとアップロードされましたが、jpgだけができません。 特に制限はかけたつもりはないのですが、どこが原因でjpgのみダメなのでしょうか?

  • w-inty
  • お礼率72% (1169/1618)
  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

>cgi-lib.pl: Request to receive too much data: 169488 bytes cgi-lib.plでは、全送信量に対して制限がかけられており 上限 2^17 = 131072 < 実送信量 169488 ということです。 画像送信には、これでは少なすぎるでしょうからcgi-lib.pl内の以下の行を探して 適当な値に変更してみてはいかがでしょう。 $cgi_lib'maxdata = 131072; # maximum bytes to accept via POST - 2^17

w-inty
質問者

お礼

回答ありがとうございます。 サイズだな、とは気づきましたがどこを直せばいいかわかりませんでした。 無事「999999」として、アップロードすることができました。 ありがとうございました。

その他の回答 (1)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

ソースを見ても原因がわからなかったので・・ 「できない」とはどういう状況でしょうか? 実行すると500エラーになる? ファイルが作成されない? ファイルは出来るけどサイズが0? それらしいファイルは出来るけど画像として表示できない(壊れている)? 原因がありそうなところで、変数を出力してみるなどすると原因が探れるかと思います。 あと、別件ですがファイル名を求めるのに、¥の位置を頼りにしているようですが、ブラウザによってはパス情報を送信してきません。 ~ filename="xxxx.jpg" ~ みたいに名前だけを送ってくるブラウザがあります。 なので、ご自身で使うだけならいいのですが一般に利用できるものを作るなら修正が必要です。

w-inty
質問者

お礼

回答ありがとうございます。 jpgをアップロードすると Content-type: text/html cgi-lib.pl: Request to receive too much data: 169488 bytes という表示がされ(2段目は太くて大きな字)ファイルが作成されていません。 bmpも、できるものとできないものがあるようです。 ファイルサイズの関係でしょうか? >あと、別件ですがファイル名を求めるのに、¥の位置を頼りにしているようですが、ブラウザによってはパス情報を送信してきません。 >~ filename="xxxx.jpg" ~ >みたいに名前だけを送ってくるブラウザがあります。 >なので、ご自身で使うだけならいいのですが一般に利用できるものを作るなら修正が必要です。 知りませんでした、ありがとうございます。 今回はIE5.5か6のみの使用なので、大丈夫だと思いますが、次回作成時には気をつけたいと思います。

関連するQ&A

  • Perlのファイルのアップロードの方法についてお聞きします。

    Perlのファイルのアップロードの方法についてお聞きします。 &ReadParseを用いた方法で、 $file = $in{'TENSOU'};で$file自体にデータが入るので 簡単だなと思っていましたが、送信元と送信後のファイルが若干違っていました。 使い方が間違っているのでしょうか? 以下、サンプル ◆HTML側 <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"><P> ファイル: <INPUT TYPE="file" NAME="TENSOU" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> ◆Perl側 &ReadParseの例を用いた方法 #!/perl/bin/perl #!/usr/local/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); #--->エラー対策 require 'cgi-lib.pl'; require 'jcode.pl'; $BUFSIZE = 2048; &ReadParse; # ==> 強力な変換 $file = $in{'TENSOU'}; # ==> 実態自体がデータなので、取り扱いしやすい $file_size = length($file); $file_size *= ($BUFSIZE / 1024); open(OUT, "> test.jpg"); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "$file_size(KB)<br>\n"; print "<a href=\"test.jpg\">テスト</a>\n"; exit;

    • ベストアンサー
    • CGI
  • 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のプログラムを色々と調べて、別のないようにしても同じようにプログラムがそのまま表示されてしまいます。 どなたか教えてください。 宜しくお願いします。

  • perlがうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。

    • ベストアンサー
    • Perl
  • Perlがサーバー上でうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n; print "まずい$in{'form2'}\n; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。

    • ベストアンサー
    • Perl
  • テキストファイル内の変数を展開して出力したい

    テキストファイル内に変数を書いておいて、出力時に その変数を展開させる方法を教えてください。 具体的には、[test.txt]を[出力]のようにしたいのです。 ためしに[test.cgi]を作ったのですが[test.txt]の内容がそのまま出てきてしまいました。 [test2.cgi]ができるなら、[test.cgi]でもできると思っていたのですが… [test.cgi] #!/usr/local/bin/perl $moji="OK"; print "Content-type: text/html\n\n"; open(IN, 'test.txt'); while (<IN>) { print "$_"; } close(IN); exit; [test2.cgi] #!/usr/local/bin/perl $moji="OK"; $naka="<HTML><BODY>$moji</BODY></HTML>"; print "Content-type: text/html\n\n"; print "$naka"; } close(IN); exit; [test.txt] <HTML><BODY>$moji</BODY></HTML> [出力] <HTML><BODY>OK</BODY></HTML>

    • ベストアンサー
    • Perl
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

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

    アップローダを作成しています。 しかしなぜか受け取る側の.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で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
  • CGIへ飛ばずに処理だけさせたい

    HTMLのフォームからsubmitしてcgiにアクセスする。 cgiでHTMLからのポストとゲットを読み込んで ログファイルに書き込む。 というCGIを作ったんだけど、 print "Content-type: text/html\n\n"; を書かないと、submitしてからcgiの処理が 止まらないみたいでした。 print "Content-type: text/html\n\n"; を書くと、処理は正常になるけど、cgiファイルに ジャンプしてしまいます。 openで書き込みをする場合、cgiに飛ばずに 処理する方法を教えてください。

    • ベストアンサー
    • CGI
  • cgi-lib.plのオフラインでの使用

    cgiの勉強をしています、Foolisともうします。 タイトルの通り、cgi-plをオフラインで使用したいのですが、やり方がわかりません。 今、httpdを使用して、 http://127.0.0.1/hello.cgi にアクセスしたら、(hello.cgiは以下の通り) ______________________ #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML><BODY>\n"; print "<H2>Hello! WORLD</H2>\n"; print "</BODY></HTML>\n"; exit; _____________________________ ちゃんとHello! WORLDと表示します。 form.htmlおよび、form.cgiを http://www.try-net.or.jp/~tanukiti/hp-add/cgi_learning/kl_cgi_09.html ここのページのように入力し、ファイルを作成したのですが、上手く動きません。もし解決策をご存知の方がいましたらよろしくおねがいいたします。

    • ベストアンサー
    • Perl