• 締切済み

ActivePerl,UTF-8環境のCGIにてブラウザからアップロー

ActivePerl,UTF-8環境のCGIにてブラウザからアップロードしたファイルの保存に失敗する件について、原因と対処方法をお願いいたします。 以下の環境でCGIを作成していましたが、  WindowsXP  ApacheServer  ActivePerl 5.10系 先日HDDがクラッシュしましたので、Windowsの再インストールからはじめて同じ環境を構築し動作確認を行っていたところ、新しい環境ではファイルのアップロードに失敗することが判明しました。 ファイルのバイナリが壊れるようです。画像等バイナリファイルをアップロードすると、ファイルサイズが3割程度増えたものが保存され、壊れます。 今回変わったところと言えば、ActivePerlのバージョンが最新になったくらいです。 調べても原因が判明しなかったことに加え、  クラッシュ前の環境ではこのような問題はなかった  Linuxサーバでは問題ない ので、悩んでいます。 問題部分のソースはこのようになります。 use utf8; # 略 CGIモジュールを使用しています $fh = $q->upload(key); open (OUT, ">$directoryname$filename"); binmode (OUT); while(read($fh, $buffer, 1024)){ print OUT $buffer;} close (OUT); close ($fh); どこも間違っていないと思うのですが、どなたかこの問題を解決できる方はおられるでしょうか。

  • Perl
  • 回答数3
  • ありがとう数5

みんなの回答

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

一時ファイルに格納された段階で、すでにファイルサイズが増加しているように思えます。use utf8; を使わないか、順番を変えたらどうなりますか? use CGI; BEGIN { $q = CGI->new; } use utf8; ...

cafemilk_m
質問者

補足

格納された段階で壊れている可能性が高いと私も思っています。 自作したフレームワーク内でのことですのでuse utf8は削れません。 BIGINはエラーになります。

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

ファイルアップロード用の HTML のフォームに ENCTYPE を指定してありますか? <FORM ACTION="/cgi/xxxxx.cgi" METHOD="POST" ENCTYPE="multipart/form-data">

cafemilk_m
質問者

補足

問題ありません。 ENCTYPEは記述しています。

回答No.1

これをいれるとどうなりますか binmode $fh;

cafemilk_m
質問者

補足

アドバイスありがとうございます。 変化なしでした。

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

  • 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
  • ActivePerlでのCGI設定

    Active Perl と AnHttpd を使ってCGIを作っているのですが、別ディレクトリにあるCGIを呼び出せなくて困っています。 F:\Dataドライブ配下に 以下のようなディレクトリ・ファイル構成で /public_html  index.html  /html   /AAA    AAA.html  /cgi-bin   aaa.cgi ルートディレクトリ/public_htmlの中に htmlファイル index.htmlと ディレクトリ /html /cgi-bin があり、 /html配下/AAAディレクトリにあるAAA.htmlから aaa.cgiを呼び出したいのですが、 「ページが見つかりません」というメッセージがでて、aaa.cgiを呼び出すことができません。 AAA.htmlには <form name="form" method="post" action='../../cgi-bin/aaa.cgi'> ・・・・・・ </form> というように設定しているのですがaaa.cgiがよびだせません。 WinNT環境でActivePerlとAnHttpdを使ったCGIの設定をご存知の方がいらっしゃいましたら、すみませんが教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • 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
  • Perlでutf-8の読み込み

    Perlでutf-8で書かれたファイルを読み込んでいます。 open(FH, "<:utf8", $filename); my @lines=<FH>; close(FH); ファイルの中に「マリー・アントワネット」という文字があるのですが、これが読み込まれた結果「マリー?アントワネット」になってしまいます。この理由と対処法をご存じの方がいらっしゃいましたら、教えてください。 なお、perlのバージョンは5.8.4です。 よろしくお願いします。

  • Perlの日記プログラムがIIS+ActivePerlで動かない

    ひとに見せるためでなく書いていた日記があり、これまで無料のCGI可サーバを使っていたのですが、今度からCGI不可になるということで、自宅のマシン(Win2K)にIIS+ActivePerlを導入して動作させようとしています。 過去データの表示はできるようになったのですが書き込みができません。エラー表示もなくタイムアウトになります。 無料サーバを使っていたときはFTPでファイルをアップロードしたときにパーミッションを変えたりしたのですが同じようにFTPソフトで変更しようとしたらWindowsではパーミッションを変更できない、と出ます。 このプログラムはIIS+ActivePerl上では動かせないのでしょうか。それとも何か設定を変えれば書き込みできるようになるのでしょうか。なお、日記CGIはnickyを使っています。 基礎的な知識がなく何が問題なのかアタリもつけられません。「ここらへん疑ってみ」などのアドバイスがありましたら教えてください。よろしくお願いします

  • 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
  • 今更ながらdbmopenでutf8環境にハマってます。

    今更ながらdbmopenでutf8環境にハマってます。 #!/usr/bin/perl use strict; use warnings; use utf8; use open ":utf8"; use open ":std"; my $key1='test'; my $key2='test2'; my $val1 = 'あああ'; my $val2 = 'いいい'; print "$key1 $val1\n"; print "$key2 $val2\n"; open(my$fh,">./utf8DB2"); print $fh "$val1\n"; print $fh "$val2\n"; close $fh; my %HASH; dbmopen(%HASH, 'utf8DB', 0666); #utf8::decode($val1) if utf8::is_utf8($val1); #utf8::decode($val2) if utf8::is_utf8($val2); #下記2行が無いとWide character in null operation at ... utf8::encode($val1)if utf8::is_utf8($val1); utf8::encode($val2)if utf8::is_utf8($val2); $HASH{$key1}="$val1"; $HASH{$key2}="$val2"; dbmclose(%HASH); my%DBM; dbmopen(%DBM,'utf8DB',0666); while ( my( $key , $val ) = each %DBM ){ #utf8::decode($val) if utf8::is_utf8($val); #utf8::encode($val) if utf8::is_utf8($val); print "key1 : $key 値 : $val\n" ; } foreach my$key ( keys( %DBM ) ) { #utf8::decode($DBM{$key}) if utf8::is_utf8($DBM{$key}); #utf8::encode($DBM{$key}) if utf8::is_utf8($DBM{$key}); print "key2 : $key 値 : $DBM{$key}\n"; } dbmclose(%DBM); 上記スクリプトを実行時、値を表示する際に文字化けしているのですが、これは、dbmopenで保存時既に文字化けしているのでしょうか、それとも表示する際、適切にエンコードorデコード出来てないから文字化けしているのでしょうか。 また、どのようにすれば解決可能かご教授願えませんでしょうか。 いっその事、DataDumperで保存し、読み出すように修正しようかとも思うのですが、tieに変更した場合も、同様に文字化けするのでしょうか・・ その辺りも含め、アドバイス他ご教授願えますと助かります。

    • ベストアンサー
    • Perl
  • ファイル出力をUTF8NではなくてUTF8で行いたい

    おせわになります。 Shift-JISで記述したPerlで、ファイル出力をしようとしています。 ------------------------------------ #!/usr/local/bin/perl use encoding 'shiftjis'; $hoge="ほげ" open(OUT,">file.txt") binmode OUT; print OUT $hoge; close(OUT); ------------------------------------ 希望はUTF8での出力なのですが、UTF8Nで出力されてしまいます。 どのようにすればいいのかご教授よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう