• ベストアンサー

バイナリファイルの扱いについて

お世話になります。MYSQLのカテゴリーにするか迷いましたが、こちらで質問させていただきます。 アップロードしたバイナリファイルをデータベースに格納したいのですが、データベースの中は空になってしまいます。 ファイルの中身を変数にバイナリとして取り込み、その変数をINSERT文で挿入するというのは、どう書いたらいいのでしょうか? #!C:\Perl\bin\perl use CGI; use DBI; $PCMOJPATH='C:パス名; my $form = CGI->new; print $form->header(-type => "text/html"); $form->charset('Shift_JIS'); my($filename) = $form->param('uploadFile'); $time = time . $$; $newfile = "upload_$time";  :  : という感じで書いているのですが、変数にバイナリとして取り込むのができません。 どうぞよろしくお願いします。

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

  • ベストアンサー
  • hikomin
  • ベストアンサー率63% (40/63)
回答No.3

前提として、アップロードフォームのnameをfileとします。 -- binmode STDIN, ':byte': # 念のため、STDINのレイヤーを指定 my $q = new CGI; # CGIオブジェクト作成 my $ufh = $q->upload('file'); # アップロード用ファイルハンドル取得 my $buffer = join undef, <$upload_fh>; # $bufferに読み込み -- このサンプルでは単純に$bufferに読み込むだけですが、安全の為予めサイズを確認したり、タイプを確認したりする必要はあるでしょう。($ENV{'CONTENT_LENGTH'}や$q->uploadInfo($q->param('file')->{'Content-Type'}等が役立ちます。) ファイルに書き出すのであればwhileとreadを用いて細切れにバッファリングしながら処理しますが、今回は全て読み込むとの事なので単純なサンプルとしました。 CGIモジュールの設定用変数$CGI::DISABLE_UPLOADS, $CGI::POST_MAXの値に気をつけてください。前者はアップロード可能かどうか(0で許可)、後者はアップロードを許可する最大サイズです。

CAL5
質問者

お礼

hikomin様、回答くださりあとうございます。 教えていただいたサンプルを参考にさせていただきまして、うまく変数に取り込むことができました。助かりました!たくさんのご教授ありがとうございました。 my $filename=param('uploadFile'); my $Mime=uploadInfo($filename)->{'Content-Type'}; を使ってタイプを取得させました。(フォームでNAME=uploadFileとしています) モジュールの設定用変数については、$CGI::Post_MAX=1024*250;としてみました。 どうもありがとうございました。

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

その他の回答 (2)

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

まずは、バイナリーファイルの中身がちゃんと送信されているのかが問題ですね。 FORMタグに ENCTYPE="multipart/form-data" を指定してありますか? なければ、これをいれましょう。 次に、CGI.pmでmultipart/form-dataを取り込むには、以下のような記述になるかとおもいますが、 $form->read_multipart($boundary,$content_length); 私自身は、CGI.pmは、あまり使いこなしていないので、他の方のご回答を待ちましょう。 cgi-lib.plなら、直ぐなんだけど。 &ReadParse(); ### %in:data; %incfn:filename; %inct:filetype $filetype =$inct{'file_tag_name'}; $filename =$incfn{'file_tag_name'}; $filedata= $in{'file_tag_name'};

CAL5
質問者

お礼

hrm_mmm様、早速の回答ありがとうございます。 >FORMタグに ENCTYPE="multipart/form-data" を指定してありますか?  確認しましたところ、"multipart/form-data"と指定しておりました。 $form->read_multipart($boundary,$content_length); という記述はしりませんでした。調べてみます。 また、cgi-lib.plの方法まで教えていただきありがとうございました。

すると、全ての回答が全文表示されます。
  • arcsin
  • ベストアンサー率70% (28/40)
回答No.1

MYSQLは私は全くわからないのですが、windowsだと、バイナリとテキストの区別があるため、ブラウザから画像などをアップロードする際には、デコード時に、 binmode(STDIN); (STDINは標準入力 :ブラウザから送られてくる入力) 等してバイナリであることを教えてやる必要があります。cgi-lib.plを使っていらっしゃるのであれば話しは別ですが、一応何かの解決方法につながれば幸いです。 的外れでしたらごめんなさい。

CAL5
質問者

お礼

arcsin様、早速の回答ありがとうございます。 binmode(STDIN); についてのアドバイス参考になりました。 自分のスクリプトで()の中の指定が間違えておりました。 いつもありがとうございます。

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

関連するQ&A