• 締切済み

cgi.pmで テキスト文書(text.txtなど)をアップロードするには・・・・?

cgi.pmで画像をアップするときに以下のような処理をおこなっていました。画像はサーバに保存できます。 #前処理省略 while($bytesread = read($filename, $buffer, $BUFSZ)){ $file .= $buffer; $file_size ++; } # 画像を書き込む open(IMGOUT, ">$filname") or exit; binmode(IMGOUT); print(IMGOUT $file); close(IMGOUT); しかし、formでtext文章(拡張子txt)のものを選択するとうまくいきません。検索中のページは現在、利用できません。Web サイトに技術的な問題が発生しているか、ブラウザの設定を調整する必要があります。というエラーがでます。perl -cwでチェックしましたがエラーはでてきません。 画像とテキストでは違う処理を施さなければならないのでしょうか? open()~close()までをコメントあうとして、ファイルを実際に書き込まないようにしたのですが、同じエラーがでたので、それより前に問題があるようです。

みんなの回答

回答No.1

結論から言えば、 どんな種類のファイルでも処理は同じです。 ですので、画像で保存ができていれば、 テキストファイルでも保存ができるはずです。 >検索中のページは現在、利用できません。(後略) 等のエラー表示が出るとのことですが、 CGIのヘッダ等の出力とかが抜けているのではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルのアップロードについて

    PERLでファイルのアップロード機能を作成しています。 アップロードと言っても、サーバへのコピーではなく、 データベースへバイナリで格納しなければならないのです。 とりあえず2パターン作成してみたのですが、 OPEN関数を使ってやるとうまくいきません。 -----パターン1(OPEN関数使用)------------- $query = new CGI; $filename = $query->param('msds'); # ファイル名(フルパス)取得 if($filename ne "") { open(ATT, $filename);# or die "Could not open atachment file:"; binmode(ATT); while($bytesread = read(ATT, $buffer, $BUFSZ)){ $file .= $buffer; # ファイルサイズ制限 $file_size ++; if($file_size > 300){ exitError("ファイルサイズが大きすぎます。600KB 以下にして下さい。"); } } close(ATT); } -----パターン2(OPEN関数未使用)------------- $query = new CGI; $filename = $query->param('temp1'); # ファイル名(フルパス)取得 if($filename ne "") { while($bytesread = read($filename, $buffer, $BUFSZ)){ $file .= $buffer; # ファイルサイズ制限 $file_size ++; if($file_size > 300){ exitError("ファイルサイズが大きすぎます。600KB 以下にして下さい。"); } } print "FILE DATA:" . $file . "<BR>"; } パターン2でprint $fileをすると、ファイルの内容が 画面表示されるのですが、パターン1だと、While文に 入ってくれませんでした。 原因がさっぱりわかりません。。。 お分かりになる方が見えましたらご教授願います。

    • ベストアンサー
    • CGI
  • CGI のモジュールをつかってファイルのアップロード

    use CGI qw(:standard); use File::Basename; $upimg1_pm = param('upimg1'); while (read($upimg1_pm, $buffer, 2048)) { $file .= $buffer; } $FileName = basename($upimg1_pm, ""); open UP,"> $img_dir/$FileName"; binmode UP; print UP $file; close UP; 上のようにファイルのアップロードのプログラムを書いたのですが、実際アップロードしたら C:\Documents and Settings\~top.gif のようにWindowsのローカルパスがそのままファイル名としてアップロードされてしまいました。 basenameはファイル名をとるモジュールときいていたのですがなぜこうなるのでしょうか? おそれいりますがご教授おねがいします。 もしかしてFile::Basename;のモジュールがないとか・・・ Perl5です。

    • ベストアンサー
    • CGI
  • 画像アップロード時のエラーハンドリングについて

    いつもお世話になります。 ファイルアップロードするプログラムを作成しております。 ファイルサイズが100Kを超えたときにエラーメッセージを吐き出して、読み込みをやめるような処理にしたいのですが、ファイルをロックしてしまっているようです。 どのようなエラーハンドリングをすればよいのでしょうか? if ($inIMAGE1 ne '') { while ($bytesread = read($inIMAGE1, $buffer, $BUFSZ)) { $file .= $buffer; # ファイルサイズ制限 $file_size1 ++; if($file_size1 > 50) { print "Content-type: text/html\n\n"; print "*ファイルサイズが大きすぎます。100KB 以下にして下さい。\n"; #last; exit(0); }      }

    • ベストアンサー
    • Perl
  • cgi(perl)でアップロードされたファイルを保存する方法について

    ファイルをアップロードするフォーム"form.html"(method="POST" action="/cgi-bin/form.cgi")を書きました。 ファイルを保存する方法について疑問があるので教えて下さい。 http://www.ss.iij4u.or.jp/~somali/web/_perl_upload.html 上記URLを参考にしました。 下記の変数"$filename"には、アップロードしたファイル名(image.jpgなど)が入っています。 (アップロードされたファイル名と保存するファイル名を同じにしました。) #------------------------------------------------------------ open (OUT, ">$filename") || die "cannot open"; binmode (OUT); $i=1;#ループ回数とアップロードされたファイルのサイズの比較の為。 while(read($filename, $buffer, 1024)){ print OUT $buffer; $i++; } close (OUT); close ($filename) if ($CGI::OS ne 'UNIX'); # Windowsプラットフォーム用 print "whileループの数: $i<BR>"; #------------------------------------------------------------ while文について。 while(read($filename, $buffer, 1024)){ print OUT $buffer; 上記の2行は、1024バイトづつ$filename(アップロードしたファイル名)から読み込み、$bufferに格納。 $bufferに格納されたデータをOUTで指定した部分に書き込む、そしてそれを繰り返す。 こう理解していますが間違いないでしょうか? ファイルサイズが予想できれば、whlie文を使わずに read($filename,$temp,10000); print OUT $temp; このようにしても問題ありませんか? read関数について教えて下さい。 書籍などには、 read(FILEHANDLE,$data,1024); こう書いてありますが、上記例でFILEHANDLEを変数名$filenameにしても問題なく動作しました。 FILEHANDLEでなく、変数$filenameでも問題無いのでしょうか? FILEHANDLEと$filenameは何を示しているんですか? ファイルの先頭アドレスでしょうか? $filenameにはアップロードしたファイル名が入っているのにどうして動くのだろうと疑問に思っています。 乱文で申し訳ありませんがご教授下さい。 宜しくお願い致します。

    • ベストアンサー
    • 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.pmで取得したファイルハンドルを変数にいれるとファイル名のみになる・・・

    perlにて、 use CGI; my $q = new CGI; my $ufh = $q->upload('file'); などで$ufhにファイルハンドルを受け取り、 この直後で、アップロードなどを行うと正常に行われるのですが、 別の関数に渡してからアップロードを行うとファイル名がついた0バイトのファイルがアップロードされます。 &test($ufh); test($){ $filename = $_[0]; while(read($filename , $buffer, 1024)){ $file .=$buffer; } my $basename; my $exp; my $files; my $newfile; my @files = split(/\\/, $file_name); ($basename, $exp) = split(/\./, $files[-1]); $newfile = $basename . "." . $exp; open(FILE, "> /tmp/$newfile"); binmode(FILE); print(FILE $files); close(FILE); } ファイルハンドルを変数に格納して持ちまわすことはできないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGI..pmを使っての画像のアップロードについての質問です。

    お世話になります画像ファイルをサーバーにアップロードしたいのですが、巧くいきません。以下のコードを実行しますと O.K. File(C:\Documents and Settings\Administrator\My Documents\My Pictures\mozi_g0.gif) was uploaded as /tmp/upload_1111735699_26448 と表示されますが、これで本当に画像ファイルがアップされているのでしょうか? 私見だとサーバー側にtmpというフォルダーに画像ファイルがアップロードされるものと思い /cgi-bin/upload.cgi と同じ所にtmpというフォルダーを作りパーミッションは755にしましたが アップロードをしても空フォルダーのままです、ローカルのフォルダーの画像をサーバー側に保存する方法を御教授お願い出来ませんでしょうか html側のコード <html> <body> <form action="/cgi-bin/upload.cgi" method="POST" ENCTYPE="multipart/form-data"> file <input type="file" name="uploadFile"><br> <hr> <input type="submit" value="OK"> </form> </body> </html> ファイルアップロード本体(upload.cgi) #!/usr/bin/perl use CGI; my($form) = new CGI; print $form->header("text/html"); my($filename) = $form->param('uploadFile'); $uniqid = time . "_" . $$; $newfile = "upload_$uniqid"; # ファイルの内容を表示する。 # このように、$filename をファイルハンドルのように使うこともできる。 #while(<$filename>){ # print $_ . "<br>\n"; #} # ファイルを保存する。 open (OUTFILE,">/tmp/$newfile") or die "Can't make serverside file!\n"; while ($bytesread = read($filename,$buffer,1024)) { print OUTFILE $buffer; } print "O.K. File($filename) was uploaded as /tmp/upload_$uniqid<br>\n";

    • ベストアンサー
    • Perl
  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI
  • ファイル名の切捨てとリンクの張り方

    いつもお世話になります。 ファイルアップロードファイルを下記のように作成しました。 その後の処理でファイル名を記録しようと思ったのですが、 下記のように記述するとファイル名がフルパスになってしまいます。 (ファイル名:.$inLINK.) ファイル名をカットする方法(例:c:\temp\test.txt->test.txt)にするにはどうしたらよいのでしょうか? ファイル拡張子はtxtだけではなく、doc、xls、pdfなど多岐にわたります。 どなたかご教示お願いいたします。 ※できればこの記録したファイルを読込んでリンク表示する方法も教えて下さい。 -----------ファイル記録処理------------------------------------ print DATA $lTMPTabl[0]."<>".$inTITLE."<>".$inMAIN."<>".$inDATE."<>".$inSEL."<>".$inLINK."<>".$inFLAG."<>".$inCATE."\n"; -------------------------------------------------------- ---------ファイルアップロード-------------------------------- $BUFSZ = 2048; $file = ''; $buffer = ''; if ($inLINK ne '') { while ($bytesread = read($inLINK, $buffer, $BUFSZ)) { $file .= $buffer; } open(OUT, "> ../upload/$inLINK"); binmode(OUT); print(OUT $file); close(OUT); } ------------------------------------------------------------

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