web-dev-qa-db-ja.com

mysql blobに保存されている画像を表示する

以下のコードを実行すると、mysql Dbにblob変数として保存されている画像が表示されます。問題は、エコー '--------'のような単純なものでさえ、他にエコーする場合です。画像を呼び出す前に、画像が表示されません。ランダムな文字のみが表示されます。画像の後にエコーを出力すると、画像は表示されますが、その後は何も表示されません。これがなぜか、他のアイテムと画像を一緒に表示する方法を誰かに教えてもらえますか、ありがとう

<?php

include("inc/library.php");

connectToDatabase();

$sql = "SELECT * FROM theBlogs WHERE ID = 1;";

$result = mysql_query($sql) or die(mysql_error());  
$row = mysql_fetch_array($result);

header("Content-type: image/jpeg");
echo $row['imageContent'];
$db->close();

?>
11
kevin

画像データをbase64に変換し、<img>タグに貼り付けることができます。現在、画像データの外部にテキストを書き込もうとしています。インターネットブラウザは、テキストが画像の一部であると判断し、エラーをスローします。

このようなものを試してください:

echo '<img src="data:image/jpeg;base64,' . base64_encode( $row['imageContent'] ) . '" />';
echo 'Hello world.';

これはキャッシュできず、特に携帯電話ではかなり遅いため、これは最適なソリューションではありません。 データURIのcaniuse を確認してください。

26
user499054

まあ...なぜあなたが説明したことをするのかという答えは、header()関数を使用しているためです。 PHPでは、ヘッダー呼び出しの前に何も印刷できません。これにより、Webサーバーはコンテンツヘッダーを準備するように指示されます。通常、それらはすべてのコンテンツに完全に取って代わります。

次に、データベースに画像を保存することは、通常、2つの理由から悪い考えです。

  1. パフォーマンスとレンダリングに大きな影響を与えます。
  2. 画像を表示するだけでなく、Blobデータをレンダリングするコードを記述する必要があります。

データベース主導の画像表示に推奨される方法は、画像をディレクトリに保存し、そのファイル名をデータベースに保存することです。これで、画像を表示する場合は、表示するファイル名をDBにポーリングし、そのファイル名をHTML属性に含めるだけです。

実行もはるかに高速です。

また、スクリプトで実際にレンダリングを実行したい場合は、そのスクリプトでヘッダーを定義し、ヘッダーを定義した後で画像ブロブをエコーまたは印刷する必要があることも指摘しておきます。

Htmlタグを作成すると、src属性で次のようになることに注意してください。

<img src="image.php?id=<some_number>">

これで、image.phpファイルが画像データをタグに吐き出します。

9
Skittles

アイデアだけですが、コンテンツから画像を表示するロジックを分離することができます。つまり、id。/ filenameを受け入れるpic.phpのようなファイルを作成し(ファイル名とIDのどちらを使用して画像を参照するかわからない)、画像を表示できるということです。次に、たとえば次のようにすることで、HTMLの画像を単純に参照できます。

<p>my content</p>
<img src="pic.php?picid=1" />
<p>my Other Content</p>
3
Johann du Toit