
お世話になります。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";
:
:
という感じで書いているのですが、変数にバイナリとして取り込むのができません。
どうぞよろしくお願いします。
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で許可)、後者はアップロードを許可する最大サイズです。
hikomin様、回答くださりあとうございます。
教えていただいたサンプルを参考にさせていただきまして、うまく変数に取り込むことができました。助かりました!たくさんのご教授ありがとうございました。
my $filename=param('uploadFile');
my $Mime=uploadInfo($filename)->{'Content-Type'};
を使ってタイプを取得させました。(フォームでNAME=uploadFileとしています)
モジュールの設定用変数については、$CGI::Post_MAX=1024*250;としてみました。
どうもありがとうございました。

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'};
hrm_mmm様、早速の回答ありがとうございます。
>FORMタグに ENCTYPE="multipart/form-data" を指定してありますか?
確認しましたところ、"multipart/form-data"と指定しておりました。
$form->read_multipart($boundary,$content_length);
という記述はしりませんでした。調べてみます。
また、cgi-lib.plの方法まで教えていただきありがとうございました。
No.1
- 回答日時:
MYSQLは私は全くわからないのですが、windowsだと、バイナリとテキストの区別があるため、ブラウザから画像などをアップロードする際には、デコード時に、
binmode(STDIN);
(STDINは標準入力 :ブラウザから送られてくる入力)
等してバイナリであることを教えてやる必要があります。cgi-lib.plを使っていらっしゃるのであれば話しは別ですが、一応何かの解決方法につながれば幸いです。
的外れでしたらごめんなさい。
arcsin様、早速の回答ありがとうございます。
binmode(STDIN);
についてのアドバイス参考になりました。
自分のスクリプトで()の中の指定が間違えておりました。
いつもありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgets で値が取得できない
-
ファイル全てを .xlsm に変更し...
-
VBA テキストファイルを読み取...
-
ファイルの作成場所の分別
-
JSP URLに表示される拡張子 .jsp
-
drtファイルはどうしたら開...
-
window.open でのファイル指定方法
-
MATLABのm-fileについて
-
巨大なテキストの最終行を取得...
-
WindowsでPerlをする際,1行目の...
-
ExcelをCSV書き出す場合のシー...
-
MATLAB グローバル変数の宣言
-
エクセルVBA コードが同じでも...
-
awkスクリプトでダブルクォーテ...
-
Perlで特定行から特定行までを...
-
Windowsで複数のファイルを同じ...
-
Perlの変数に文字数制限(容量...
-
Perl-CGI で排他制御はどうすれ...
-
ディレクトリー内のリスト出力...
-
ファイルの結合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
python renameについて
-
fgets で値が取得できない
-
行を指定して削除する方法PERL
-
csvファイルの横方向への改行に...
-
drtファイルはどうしたら開...
-
MATLABのm-fileについて
-
JSP URLに表示される拡張子 .jsp
-
オブジェクト作成の順番
-
WindowsでPerlをする際,1行目の...
-
ファイル検索の条件について
-
Perl の「stringify」の意味に...
-
perl ファイルが開かない
-
Javaのフォームの入力欄に文字...
-
一つのテキストファイルと複数...
-
MP3情報の表示
-
PerlでのUseless use...
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
MySQLにバイナリデータを正常に...
おすすめ情報