perlでCSV形式ファイルのアップロードができない問題の解決方法

このQ&Aのポイント
  • perlのCGIプログラムを使用してCSV形式のファイルをアップロードする際、ファイルが作成されるが中身が書き込まれない問題が発生しています。解決方法を教えてください。
  • 同じ問題について本日、質問をしましたが解決に至っておらず、ファイルのアップロードができない状況で困っています。アドバイスをお願いします。
  • 前回の問題は解決済みですが、ファイルのアップロードができないという新たな問題が発生しています。CGIプログラムのソースコードは正しいと思われますが、原因が分かりません。解決方法を教えてください。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
回答No.1

$fileName = $query->param('fileName'); で取得できるのはアップロードしたときのファイル名で、CGI.pmはそのファイル名とは別の名前でサーバ上に一時ファイルを作ります。 $query->upload()で一時ファイルのファイルハンドラを取得し、ファイルの内容を読み出します。 $fh = $query->upload('fileName'); read($fhe,$buffer,1024); ...

hirocyan999
質問者

お礼

御礼が遅くなり申し訳ありません おっしゃる通りにやってみましたところ、できました。 ありがとうございました。

関連するQ&A

  • 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でファイルのアップロード機能を作成しています。 アップロードと言っても、サーバへのコピーではなく、 データベースへバイナリで格納しなければならないのです。 とりあえず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
  • バイナリファイルのアップロードに関して

    今回質問させて頂くことに関連した問題を、現在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にはバイナリデータがちゃんと入っていないのでしょうか?間違っているところがあれば、どのように直したらいいか教えてください。どうぞよろしくお願いします。

  • 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 Image::Magick

    恐れ入ります。perlでImage::Magickで画像の処理をしているのですが、画像によって途中までしか変換されていなかったりする画像(下部分が灰色)のものが出ます。この原因と対策をご存じの方はいらっしゃいますか? $filename = "./folder/image.jpg"; $filename 2= "./folder2/image.jpg"; $image = Image::Magick->new; $image->Read("$filename"); $width = $image->Get('width'); $height = $image->Get('height'); $image -> Set( quality => 60 ); $image->Write("$filename2"); 以上のようにしています。HTMLからファイルを受け取る部分は、 my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./folder/image.jpg"); binmode(OUT); while(read($fileName, $buffer, 2048)) { print OUT $buffer; } としています。HTMLからのアップロードは、対象フォルダの画像を確認した場合問題無くアップされています。以上よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • canvasで作成した画像をperlでアップロード

    恐れ入ります。 function upImg() { var base64 = board1.toDataURL('image/png'); var request = { url: 'https:~canvas.cgi', method: 'POST', params: { image: base64.replace(/^.*,/, '') }, success: function (response) { console.log(response.responseText); } }; Ext.Ajax.request(request); } として、perlで送信された画像データを受け取ってサーバーの任意のディレクトリに保存をしたいのですが、方法が分かりません。 perl側では、単純に open(OUT, ">./upload/gazouURL"); binmode(OUT); while(read($fileName, $buffer, 1024)) { print OUT $buffer; } close(OUT); としています。$fileNameとして受け取るパラメータはjavascriptからどのように送信されているのでしょうか。ご教授いただけたらありがたいです。よろしくお願いいたします。

  • 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
  • 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
  • CGI によるファイルのアップロード

    こんにちは。Perl初心者です。 ファイルのアップロードのプログラムを作ったのですが(と言っても書籍の丸写しですが..)サーバー上でエラーになってしまいます。どこが間違っているか教えて下さい。 環境:@niftyのホームページ(CGIは許可されています。), PC: Windows XP ソース: #!/usr/local/bin/perl use CGI qw(:standard); $file1 = param('file1'); open OUT, "> $file1"; while(<$file1>){   print OUT $_; } close OUT; $file2 = param('file2'); open OUT, "> $file2"; while(<$file2>){   print OUT $_; } close OUT; print <<"EOL"; Content-type: text/html <html> <body> Files have been uploaded.<br> $file1<br> $file2<br> </body> </html> EOL exit;

    • 締切済み
    • CGI
  • 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

専門家に質問してみよう