web-dev-qa-db-ja.com

PHPを使用してMySQLデータベースから画像を保存および取得するにはどうすればよいですか?

MySQLに画像を挿入し、PHPを使用して取得するにはどうすればよいですか?

私はどちらの分野でも経験が限られており、少しのコードを使用してこれを理解するために始めることができました。

58
Mask

まず、次のような画像を保存するMySQLテーブルを作成します。

create table testblob (
    image_id        tinyint(3)  not null default '0',
    image_type      varchar(25) not null default '',
    image           blob        not null,
    image_size      varchar(25) not null default '',
    image_ctgy      varchar(25) not null default '',
    image_name      varchar(50) not null default ''
);

その後、次のようにデータベースにイメージを書き込むことができます。

/***
 * All of the below MySQL_ commands can be easily
 * translated to MySQLi_ with the additions as commented
 ***/ 
$imgData = file_get_contents($filename);
$size = getimagesize($filename);
mysql_connect("localhost", "$username", "$password");
mysql_select_db ("$dbname");
// mysqli 
// $link = mysqli_connect("localhost", $username, $password,$dbname); 
$sql = sprintf("INSERT INTO testblob
    (image_type, image, image_size, image_name)
    VALUES
    ('%s', '%s', '%d', '%s')",
    /***
     * For all mysqli_ functions below, the syntax is:
     * mysqli_whartever($link, $functionContents); 
     ***/
    mysql_real_escape_string($size['mime']),
    mysql_real_escape_string($imgData),
    $size[3],
    mysql_real_escape_string($_FILES['userfile']['name'])
    );
mysql_query($sql);

以下を使用して、Webページのデータベースから画像を表示できます。

$link = mysql_connect("localhost", "username", "password");
mysql_select_db("testblob");
$sql = "SELECT image FROM testblob WHERE image_id=0";
$result = mysql_query("$sql");
header("Content-type: image/jpeg");
echo mysql_result($result, 0);
mysql_close($link);
121
Andomar

データベースに画像を保存する代わりに、ディスクのフォルダに画像を保存し、データベースに画像の場所を保存します。

22
Ankit Sharma

DBからの画像の提供は通常、ディスクからの提供よりもはるかにmuch遅いことに注意してください。

PHPプロセスを開始し、DB接続を開き、DBが同じディスクから画像データを読み取り、RAMをファイルシステムと同じようにキャッシュし、いくつかのソケットで転送します。バッファリングしてからPHP経由でプッシュします。これにより、デフォルトでキャッシュ不可になり、チャンクHTTPエンコーディングのオーバーヘッドが追加されます。

OTOHの最新のWebサーバーは、最適化されたカーネル呼び出し(メモリマップファイルとTCPスタックに渡されるメモリ領域)をわずかに使用して画像を提供できるため、メモリをコピーすることもオーバーヘッドもほとんどありません。

これは、1台のマシンで20個または2000個のイメージを並行して提供できることの違いです。

だからしないでくださいトランザクションの整合性が絶対に必要な場合(実際には、DBおよびファイルシステムクリーンアップルーチンのイメージメタデータだけでも可能です)およびPHPのHTTP処理を適切にする方法を知っている場合を除きます画像用。

9
Kornel

私もこれを考えて、DBではなくファイルシステムに画像を保存することを選択することをお勧めします..ここを参照してください: DBに画像を保存する

6
Scott Evernden

私の意見では、画像をデータベースに直接保存する代わりに、画像の場所をデータベースに保存することをお勧めします。両方のオプションを比較すると、データベースに画像を保存することはセキュリティ目的で安全です。欠点は

  1. データベースが破損している場合、取得する方法はありません。

  2. 他のオプションと比較すると、dbからのイメージファイルの取得が遅い。

一方、画像ファイルの場所をdbに保存すると、次の利点があります。

  1. 取得は簡単です。

  2. 複数の画像が保存されている場合、画像情報を簡単に取得できます。

6
Gunaseelan

個人的には、画像をデータベースに保存せず、代わりに外部からアクセスできないフォルダに保存し、その場所を追跡するためにデータベースを使用します。データベースのサイズを抑え、PHPを使用してデータベースを含めることができます。 PHPなしでその画像にアクセスする方法はありません

4
exussum