• ベストアンサー

htmlフォームから受け取ったファイルをDBへ保存

htmlのフォームタグ内で、inputtyp=file で受け取ったwordファイルやPDFファイルを perlで書いたCGIプログラムのほうで、MYSQLのデータベースへ保存したいのですが どのように書けばいいのかわかりません。 保存する型はBLOB型でよいといくつかのサイトで書いてあるのですが、 SQL文の書き方や、フォームから受け取ったデータの処理の仕方などの詳細が わかりません。 フォームで受け取ったファイルをデータベース(mysql)へ保存する 簡単なサンプルコードなどが知りたいです。 よろしくお願いいたします。

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

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

  • ベストアンサー
  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.2

PerlによるMySQL DBへのアクセスでは、DBIモジュールを使うのが最も代表的な方法です。 DBIモジュールとDBD::mysqlモジュールが利用できる環境が必要です。 以下に、DBIモジュールによるファイルアップロードのサンプルを示します。 #!/usr/local/bin/perl ←利用環境に合わせて書き換え use strict; use warnings; use CGI; use CGI::Carp qw(fatalsToBrowser); use DBI; use DBD::mysql; # 各種設定 my $db_host = 'localhost'; # DBホスト名 my $db_name = 'dbname'; # DB名 my $db_user = 'user'; # DBユーザー名 my $db_pass = 'password'; # DBパスワード # CGI POSTデータ取得 my $cgi = new CGI; my $fh = $cgi->param('fileform') or die "Upload file is missing\n"; # <INPUT>要素のNAMEを指定 binmode($fh); read($fh, my $file, -s $fh); close($fh); # DBに接続 my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass) or die $DBI::errstr; # SQLでファイルバイナリをINSERT my $sth = $dbh->prepare('INSERT INTO tablename SET file=?') or die $dbh->errstr; # DBテーブル構造に合わせて適宜変更 my $rv = $sth->execute($file); if(! $rv || $rv eq '0E0') { die $sth->errstr; } $sth->finish; # DB切断 $dbh->disconnect; # CGI結果出力 print "Content-Type: text/html;\x0D\x0A\x0D\x0A"; print "<html><body>Upload done.</body></html>"; exit; =comment データベーステーブルを生成するSQL文の例: CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARACTER SET utf8; USE dbname; CREATE TABLE IF NOT EXISTS tablename ( id MEDIUMINT AUTO_INCREMENT NOT NULL, file MEDIUMBLOB, PRIMARY KEY (id) ) ENGINE=InnoDB,DEFAULT CHARACTER SET utf8; =cut =comment ファイルアップロードフォームの例: <html> <body> <form method="POST" action="fileupload.cgi"><!-- ←CGIファイル名に合わせて書き換え --> <input type="file" name="fileform"> <input type="submit"> </form> </body> </html> =cut 以上です。詳細は「Perl DBI」などで検索してください。 ただし、Perlでリレーショナルデータベースを扱う以上は、PerlおよびSQLの文法については最低限の知識として勉強する必要があります。 上記のサンプルでも、データベーステーブルの生成やアカウント作成は含まれていませんので、事前に済ませておく必要があります。 Webアプリケーションフレームワークではテーブルの生成をやってくれるものもありますが、それらも勉強せずに一朝一夕で使えるものではありません。 またDBIモジュール以外にも、DBIx::Classモジュールなども多く使われています。ご自分の環境や技量に応じて使いやすいものを選ぶといいでしょう。

hi_mawa
質問者

お礼

わかりやすいサンプルをありがとうございます! しっかりとファイルをデータベースに保存することができました。 perlもデータベースも最近始めたばかりですが、少しづつ勉強して使いこなせるようになりたいと思います。 本当にありがとうございました。

hi_mawa
質問者

補足

すいません、wordファイルは保存することができたのですが、 1メガバイトほどのPDFファイルを選択すると保存ができなくなってしまいました。 カラムの型はLONGBLOBにしてあるのですが、PDFファイルの保存はできないのでしょうか? 何度も申し訳ございません。

その他の回答 (2)

  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.3

> 1メガバイトほどのPDFファイルを選択すると保存ができなくなってしまいました。 おそらくMySQLサーバーの設定の問題だと思います。 MySQLでは通信パケットの最大サイズのデフォルト値が1MBになっています。 my.iniのmysqldセクションでmax_allowed_packetとして指定できますので、この値を大きくしてやればいいです。 [mysqld] max_allowed_packet=16MB その他の要因としては、レンタルサーバーなどでApacheの設定によってPOSTの最大サイズが制限されている場合があります。この場合、自分で管理していないサーバーだったりするとお手上げかもしれません。サーバー管理者に相談してください。 あと、PerlのCGI.pmでも最大POSTサイズを制限する変数があります($CGI::POST_MAX)。 こちらは通常の環境ではデフォルト値が -1 (無制限)のはずですのでたぶん無関係と思いますが、念のため存在だけご紹介しておきます。

hi_mawa
質問者

補足

回答ありがとうございます。 my.iniのmysqldセクションのmax_allowed_packetを確認したところ 16Mとなっており問題ありませんでした。 Apacheのほうは、httpd.confに <Files *.pdf> LimitRequestBody 10485760 </Files> を追加てみたんですが、1MサイズのPDFは保存できませんでした。 また、CGI.pmの$CGI::POST_MAXも確認したところ $CGI::POST_MAX=1024 * 100; # max 100K posts となっていましたの $CGI::POST_MAX=1024 * 5000; に直してみたんですが、やはりPDFの保存はできませんでした。 試しに500KBとほどのPDFで確認してみたんですが、こちらは保存できていました。 原因はファイルサイズのようですが、うまくいきません。 POSTのサイズのほうについてもう少し調べてみようと思います。

noname#158634
noname#158634
回答No.1
hi_mawa
質問者

補足

リンク先を参照させていただきましたが、こちらjavaで書かれているようでした。 また、独自のクラスメソッドなども使っているようでして、問題解決までにはいきませんでした。 参考にできる部分もあると思いますので、活用させていただきます。回答ありがとうございます。

関連するQ&A

  • htmlフォームから受け取ったファイルをDBへ保存

    htmlのフォームタグ内で、input type=file で受け取ったPDFファイルを phpスクリプトで、MYSQLのデータベースへ保存したいのですが どのように書けばいいのかわかりません。 保存する型はBLOB型でよいといくつかのサイトで書いてあるのですが、 SQL文の書き方や、フォームから受け取ったデータの処理の仕方などの詳細が わかりません。 フォームで受け取ったファイルをデータベース(mysql)へ保存する 簡単なサンプルコードなどが知りたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • フォーム内容の記述と、CGIファイルの関連はどのように?

    基礎的な質問でしょうが、どなたか教えて下さい・・。 フォームタグで、 「 <body> <form action="cgi-bin/xx.cgi" method="post"> フォーム(ラジオボタンなど)の内容の記述 </form></body> 」 の記述の中で、「xx.cgi」のファイルはどのように作成すればよいのでしょうか。そして全てのフォームに対応するcgiファイルがあるのでしょうか。そのCGIファイルをフォルダ(cgi-bin)にアップロードすればよいのですか?。ホームページを作成してもフォームタグに対するCGIの解説が記載されていませんので・・。

    • 締切済み
    • CGI
  • DB2のBLOB型カラムに格納されたファイルをアプリケーションで表示する方法

    こんばんは。 初歩的な質問なのですが、 宜しくお願いします。 データベースはDB2で、 BLOB型のカラムを持つテーブルがあります。 BLOB型のカラムには、PDFファイルが格納されています。 このPDFファイルを参照したいです。 どのようにすれば、 アクロバットリーダーで表示することができますか。

  • ACCESSのフォームって?

    SQL言語を使って検索した結果をフォームに反映したいと思っているのですが、フォームには「ヘッダ」「詳細」「フッタ」がありこの違いがよく分かりません。 SQLだけで使う場合関係ないのでしょうか? 今まではMYSQL+PHP3を使っていましたが今回ローカルで動くデータベースが必要になりACCESSを使うことにしてみました。 変な書込みですいませんが宜しくお願いします。

  • MY-SQL+PHPファイルのアップロード

    MY-SQL+PHPでファイルを保存したり読み出したりしたいと考えています。 MY-SQLにファイルの保存先を保存して、ファイルはデータベース内ではないところにおいておき、読み出したりしたいとおもっています。 ただどのように作ればいいのかわかりません。簡単なサンプルだけでもご教授していただけないでしょうか?

    • ベストアンサー
    • MySQL
  • 画像をDBに保存し、表示させるのは・・・?

    はじめまして。 今、(1)ファイル参照から画像ファイルを選択してDB(MySQL:phpMyAdmin2.10.1)にある フィールド(gazou)へBLOBのバイナリで保存し、 (2)違うぺージでDBに保存してある画像を、検索して表示させたいのですが、 以下のようになってしまい、表示できません。 http://shokuhidiet.web9.jp/a/3.bmp ソースを載せておきます。どうかよろしくお願いいたします。 http://shokuhidiet.web9.jp/a/sos.txt

    • ベストアンサー
    • PHP
  • MySQLでデータベースを一つのファイルにひたすら保存していいのか

    MySQLでデータベースを一つのファイルにひたすら保存していいのか PHPでMySQLを使用しています。 データベースを作る時は以前から二つの方法を使っています。 ・データベースファイルを一定のデータ量になると分割する方法 ・データベースファイルを分割せず一つのファイルにひたすら保存していく方法 これはどっちがいいのでしょうか? 一つのデータベースファイルに保存し続けるとユーザーがアクセスする際は そのデータベースファイルにしかアクセスしないので共有ロックの関係で ユーザーが増えるほど分割した場合に比べてオープンが低速化したりしないでしょうか?

    • ベストアンサー
    • PHP
  • CGI/Perlでメールフォームを作るには。

    CGI/Perlでメールフォームを作るにはHPのトップページ(ソースコード)にCGI/Perlのプログラムを入力すればメールフォームは使用できるようになるのでしょうか? よろしくお願いします。

    • 締切済み
    • CGI
  • PHPよりMySQL5.0にファイル(PDFやExcelなど)の登録について

    IIS上で動いているPHPよりMySQLを呼び出して、 ファイル(PDFやExcelやWordなど)をMySQLに登録することは可能でしょうか? 画像ファイルなどは、BLOBに保存しています。とネットでよく見かけるのですが、 他のファイルは可能でしょうか? (もちろん取得もいたします。) PHPは、 windows2003Server(IIS)で動いていて、 MySQL5.0は、Linux・unix上を考えています。 PHP:5.2.12 MySQL:5.0.60sp1 になります。 もし登録が可能であれば、どれくらいのファイルサイズまで可能でしょうか?

    • ベストアンサー
    • MySQL
  • フォーム 付随データ 表示

    恐れ入ります。 Mysql に保存されているデータに対し、 Perlから情報を送信します。 特定のコードをフォームに入力すると、そのコードに付随したMySQL上のレコードの情報が inputフィールドの表示されるようにしたいのですが、 方法はありますでしょうか? 例) フォームに3232と入力 その他inputフィールドに、 ---- 花 ---- バラ ---- 2000円 ---- 在庫30 ---- のように、自動的に表示されるイメージです。 よろしくお願いします。