重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。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";
 :
 :

という感じで書いているのですが、変数にバイナリとして取り込むのができません。
どうぞよろしくお願いします。

A 回答 (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で許可)、後者はアップロードを許可する最大サイズです。
    • good
    • 0
この回答へのお礼

hikomin様、回答くださりあとうございます。

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

お礼日時:2004/12/28 14:44

まずは、バイナリーファイルの中身がちゃんと送信されているのかが問題ですね。


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'};
    • good
    • 0
この回答へのお礼

hrm_mmm様、早速の回答ありがとうございます。

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

お礼日時:2004/12/28 14:01

MYSQLは私は全くわからないのですが、windowsだと、バイナリとテキストの区別があるため、ブラウザから画像などをアップロードする際には、デコード時に、



binmode(STDIN);

(STDINは標準入力 :ブラウザから送られてくる入力)

等してバイナリであることを教えてやる必要があります。cgi-lib.plを使っていらっしゃるのであれば話しは別ですが、一応何かの解決方法につながれば幸いです。
的外れでしたらごめんなさい。
    • good
    • 0
この回答へのお礼

arcsin様、早速の回答ありがとうございます。

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

お礼日時:2004/12/28 13:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!