• 締切済み

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
  • 回答数1
  • ありがとう数1

みんなの回答

  • dmq
  • ベストアンサー率80% (21/26)
回答No.1

あなたのPC上でCGIを動かすためには、最低限Webサーバーの知識が必要です。 まずCGIが動く仕組みについて、Webサーバー(特にApache HTTP Server)と組み合わせて勉強すると、 とても幸せになれると思います。

hirocyan999
質問者

お礼

ありがとうございました。 ケアレスミスでした。

関連するQ&A

  • 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
  • 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
  • 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 のモジュールをつかってファイルのアップロード

    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
  • 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 アップロード

    http://hole.sugutsukaeru.jp/archives/10 こちらのサイトでPerlでのファイルのアップロードを行なおう思い、 作成しているのですが、 エラーになり表示されません。 コードを貼り付けると、 #!/usr/bin/perl -w #使用するモジュールをロード use File::Basename; use CGI; #変数宣言 my ($form, $dir, $filename, $parsename, @filename, $error, $ok, $type, $newfile, $i, $buffer, @ext_ok); #ファイルを保存するディレクトリを設定 #(CGIの実行ユーザで書き込み権限が必要) $dir = './files'; #受付可能な拡張子(正規表現) @ext_ok = qw ( txt zip pdf doc cgi ); #CGIオブジェクトを作成 $form = new CGI; #転送できるファイルの最大サイズを設定 #(実際は、post送信されるコンテンツ合計の最大サイズ) #この値は、CGIオブジェクトを作成する時には既に #設定されていなければならない $CGI::POST_MAX = 1024 * 1000; #max = 1MB #CGIオブジェクトを作成 $form = new CGI; #クライアントにヘッダを送信 #これは、結果メッセージ表示のため binmode STDOUT; print "Content-Type: text/plain;charset=euc-jp\r\n\r\n"; #ファイルの転送のチェック if (!defined($filename) and $error = $form->cgi_error){ #ファイルが転送されていなかったら、$filename は 未定義値となっている。 #フォーム上でファイルを選択しないままフォームがサブミットされた場合は、 #通常はこの変数 $filename は空文字列として定義されている(=未定義ではない)。 #このため、以前のバージョンでは $filename が定義されている #かどうかをエラーの判別の基準としていたが、 #2007年3月 Mac OS X 上の Netscape 7.1 で試したところ、 #ファイル選択されていない場合に未定義値になることが判明。 #このため、エラーの場合に設定される(筈の)値 $form->cgi_error も判別の #基準に追加した。 print "ファイルが転送できませんでした:$error\n"; exit; } if ($filename) { #ファイルが転送されていれば、値は真 #ファイルパス内の「\」を「/」に変換 # $parsename には、送信元クライアントマシン内での #ファイルパスが格納されている。 #注:Shift_JISで実装する場合、このあたりには工夫が必要。 $parsename =~ s#\\#/#g; #ファイル名を(ベース名, ディレクトリ名, 拡張子)に分解 @filename = fileparse($parsename, "\.[^\.]+"); #ベース名のチェック(アスキー文字列であること) $filename[0] =~ /^[\.\w~-]+$/ and $filename[2] =~ /^[\.\w-]+$/ and $ok = 1; unless ($ok) { $error = 'ファイル名は、半角英数字にして下さい。'; print "ファイル転送ができませんでした。: $error\n"; exit; } $ok = 0; #フラグのリセット #拡張子のチェック foreach (@ext_ok){ $filename[2] =~ /^\.$_$/ and $ok = 1 and last; } unless ($ok){ $error = "許可されていない拡張子($filename[2])です。"; print "ファイル転送ができませんでした。: $error\n"; exit; #サーバ側ファイル名の決定 #まず、セッションごとに一意のディレクトリ名を作成 while (-d "$dir") { $dir = $dir.'/upload_'.&gen_unique_key(15); } #ファイルを格納するディレクトリを作成 unless (mkdir($dir, oct(777))){ print "保存ファイル用ディレクトリの作成に失敗しました。: $!\n"; exit; #サーバ側のファイルパスを設定 $newfile = $dir."/".$filename[0].$filename[2]; #既に同名のファイルが存在した場合 #(複数の同名ファイルを同時にアップロードした場合など)は、 #ベース名にアンダースコアと番号を付けて別名にする $i = 0; while (-f "$newfile"){ $i++; $newfile = $dir."/".$filename[0]."_".$i.$filename[2]; } #ファイルの保存 unless (open (OUTFILE,">$newfile")){ print "サーバ側の保存ファイルの作成に失敗しました。: $!\n"; exit; } #保存用ファイルを無事 open できた場合 #改行コードの自動変換を停止 binmode (OUTFILE); binmode ($filename); # $filename から内容を読み出して #保存用ファイルに書き出す #この場合、変数 $filename はファイルハンドルとして #機能する while (read($filename,$buffer,1024)) { print OUTFILE $buffer; #ファイルを close して終了メッセージを表示 #この場合、$filename は、送信元クライアント #マシン内でのファイルパス(ブラウザが送信してきた値)を返す close (OUTFILE) and print "送信されたファイル ($filename) を右のファイル名で保存しました: $newfile\n" or print "サーバ側の保存ファイルのクローズに失敗しました。: $!\n"; } else { # ファイルが転送されていない場合 # $filename は 偽 print "ファイルはアップロードされていません。\n"; } #一意の文字列を作成するための関数 sub gen_unique_key($){ #生成する文字列の長さを引数で指定 my $length = shift; my ($i, $tempval, $key, $chars, @chars); #引数で指定された文字列長さが、 # 5以上 30以下の数値でない場合、15に設定 #(範囲は、長からず短からず...。) ($length =~ m/^\d+$/ and $length >= 5 and $length <= 30 ) or $length = 15; #使用する文字を指定(ディレクトリ名として使用できる文字を指定する) $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~-_'; @chars = split(//, $chars); #乱数のタネを作る srand(time|$$); for ($i=0; $i<$length; $i++){ # @chars 配列の最大の添字までの乱数を生成する $tempval = int(rand(scalar(@chars))); $key .= $chars[$tempval]; } return $key; } となりますが、どこが間違えているのでしょうか。 上記コードは、サイトからのコピペになります。 よろしくお願いします。

    • ベストアンサー
    • 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の場所も正確です。

    • ベストアンサー
    • Perl
  • ファイルのアップロードについて

    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..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
  • perlで容量の大きいCSVファイルを開く方法

    perlで容量の大きいCSVファイルを開く方法 ファイル容量の大きいcsvファイルから、必要な項目を抜き出して別ファイルにするプログラムを作成したいと思ってます。 csvファイルが少ない場合は動作したのですが、容量が140MBを超えたデータを読み込もうとすると、ブラウザー表示で何も変化いたしません プログラムは以下のようになってます。 ------------------------------------------------- 略 open(IN,"$inport") || &error(" $inport を読み込みopen出来ません"); flock(IN,1); @lines = <IN>; foreach $lines (@lines) { local(@val) = split("\,", $lines); print "$val[0]"; $dat .= "$val[1]\,$val[5]\n"; } open(OUT,">$dcsv"); flock(OUT,2); print OUT "$dat"; close OUT; 略 ------------------------------------------------- 件数も多いので、foreachを$lines (@lines) としないで($start .. $end)として読み込みの件数を制限して対応しようと考えてましたが、うまくいきませんでした。 ご指導いただけますと幸いです。

    • ベストアンサー
    • Perl

専門家に質問してみよう