Я создаю собственное приложение для управления отношениями с клиентами.
Это приложение довольно прямолинейно. Он собирает информацию о клиенте и сохраняет его для последующего использования.
Одна часть собранной информации - это изображение идентификации фотографий клиентов. Я сохраняю это изображение в своей таблице в базе данных mySQL.
Я искал способ отображения изображения в небольшом окне предварительного просмотра рядом с информацией о клиентах (имя, адрес и т.д.). То, что я нахожу для возможных решений, очень старые и обесценившиеся на данный момент, или ссылаются на отображение изображения, где только адрес файла хранится в базе данных, а сам образ сохраняется в папке на сервере.
Код, который я сейчас имею, не отображает ничего в HTML, но пустое пространство. У меня была одна версия до этого, которая отображала необработанные данные из BLOB, но все это разбивало все, поэтому я не заставил ее показать вас здесь.
Мой вопрос в том, есть ли какой-то ресурс, который кто-то может указать мне на это конкретно о том, как этот тип информации используется веб-браузером и как организовать его для отображения? ИЛИ, если по какой-то причине все это неправильно, может ли кто-нибудь указать мне на документацию, которая является лучшим способом сделать это? Я не испытываю никого из этого, и иногда мне трудно найти ответы из-за отсутствия правильной терминологии.
Таблица выглядит так:
TABLE NAME = "photoid"
row 1 = "id" (auto increment)
row 2 = "name" (varchar)
row 3 = "mime" (varchar)
row 4 = "size" (bigint)
row 5 = "data" (medium blob)
row 6 = "created" (datetime)
row 7 = "client_id" (varchar)
HTML:
<img width="400" height="200" src="<?php include ('client_display_photoid.php');?>" />
PHP:
<?php include ('connect.php');?>
<?php
$client_id = htmlspecialchars($_POST['client_id']);
// prepare stmt, bind param, execute
$stmt = $conn->prepare("SELECT mime, name, size, data FROM photoid WHERE client_id = ?");
$stmt->bind_param("s", $client_id);
$stmt->execute();
// bind results
$stmt->bind_result($mime, $name, $size, $data);
// Print headers
header("Content-Type: $mime");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename = $name");
// Print data
echo $data;
?>
<?php include ('disconnect.php');?>
EDIT 1: после просмотра комментариев я смог избавиться от "пустого пространства", которое отображалось, удалив открытые теги PHP. Я также просмотрел предоставленную ссылку и изменил свой код следующим образом.
HTML:
<img width="300px" height="150px" src="data:image/jpeg;base64,<?php echo base64_encode( $data ); ?>" />
PHP:
<?php
include ('connect.php');
$stmt = $conn->prepare("SELECT data FROM photoid WHERE client_id = ?");
$stmt->bind_param("s", $client_id);
$stmt->execute();
$stmt->bind_result($data);
include ('disconnect.php');
?>
Ниже показано, что отображается, когда я пытаюсь отобразить изображение:
<img width="300px" height="150px" src="data:image/jpeg;base64," />
EDIT 2:
Я пробовал следующий код... HTML:
<img src='client_display_photoid.php?client_id=182' />
PHP:
<?php
include ('connect.php');
$sql='select 'mime','data' from 'photoid' where 'client_id' = ?';
$stmt=$conn->prepare( $sql );
if( $stmt ){
$stmt->bind_param('s', $client_id );
$result=$stmt->execute();
$stmt->store_result();
if( $result && $stmt->num_rows==1 ){
$stmt->bind_result( $mime, $data );
$stmt->fetch();
$stmt->close();
$data=base64_decode( $data );
#$mime=image_type_to_mime_type( $mime );
$oImg = imagecreatefromstring( $data );
switch( $mime ){
case IMAGETYPE_JPEG:
header( 'Content-Type: image/jpeg' );
imagejpeg( $oImg );
break;
case IMAGETYPE_PNG:
header( 'Content-Type: image/png' );
imagepng( $oImg );
break;
case IMAGETYPE_GIF:
header( 'Content-Type: image/gif' );
imagegif( $oImg );
break;
}
imagedestroy( $oImg );
}
}
include ('disconnect.php');
?>
Все, что я верну в браузере:
<img src='client_display_photoid.php?client_id=182' />
Сегодня я столкнулся с этой связкой и обнаружил, что изменение моего PHP на следующее позволило мне просто использовать простой PHP INCLUDE в HTML для отображения изображения по своему желанию.
Похоже, что утверждение WHILE было трюком. Я также использовал некоторые из предложенных предложений и использовал ECHO-ing HTML в PHP-коде.
Большое спасибо всем, кто прокомментировал и помог.
PHP:
<?php
if (!empty($_POST['client_id'])) {
// connect to database
include ('connect.php');
// prepare stmt, bind param, execute
$stmt = $conn->prepare("SELECT data FROM photoid WHERE client_id = ?");
$stmt->bind_param("s", $client_id);
$stmt->execute();
// bind results
$stmt->bind_result($data);
while ($stmt->fetch()) {
}
echo '<img width="300" src="data:image/jpeg;base64,'.base64_encode( $data ).'"/>';
// close statement
$stmt->close();
// disconnect from databse
include ('disconnect.php');
}
?>
Следующее должно помочь получить эту сортировку для вас - db хранит кодированные данные base64 как blob и создает изображение на лету, используя php и imagecreatefromstring
. Следующий код работал для меня в тесте, поэтому с осторожностью вы должны иметь возможность изменить это, чтобы работать в вашей среде. Одно из отличий заключается в использовании целочисленного mimetype в db, а не в строке.
Вышеуказанный $ mime является целым числом, но с использованием image_type_to_mime_type
на этом возвращенном значении будет image_type_to_mime_type
строка типа mime. Это просто означает, что вам нужно изменить этот бит для работы со строками, а не с int.
mysql> describe photoid;
+-----------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| mime | tinyint(3) unsigned | NO | | NULL | |
| size | int(11) | NO | | NULL | |
| data | mediumblob | YES | | NULL | |
| created | datetime | NO | | 0000-00-00 00:00:00 | |
| client_id | varchar(50) | NO | MUL | NULL | |
+-----------+---------------------+------+-----+---------------------+----------------+
<?php
/* display profile picture: photoid.php */
$client_id=!empty( $_GET['client_id'] ) ? filter_input( INPUT_GET, 'client_id', FILTER_SANITIZE_STRING ) : false;
if( $client_id ){
$dbhost = 'localhost';
$dbuser = 'root';
$dbpwd = 'xxx';
$dbname = 'xxx';
$db = new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );
$sql='select 'mime','data' from 'photoid' where 'client_id' = ?';
$stmt=$db->prepare( $sql );
if( $stmt ){
$stmt->bind_param('s', $client_id );
$result=$stmt->execute();
$stmt->store_result();
if( $result && $stmt->num_rows==1 ){
$stmt->bind_result( $mime, $data );
$stmt->fetch();
$stmt->close();
$data=base64_decode( $data );
#$mime=image_type_to_mime_type( $mime );
$oImg = imagecreatefromstring( $data );
switch( $mime ){
case IMAGETYPE_JPEG:
header( 'Content-Type: image/jpeg' );
imagejpeg( $oImg );
break;
case IMAGETYPE_PNG:
header( 'Content-Type: image/png' );
imagepng( $oImg );
break;
case IMAGETYPE_GIF:
header( 'Content-Type: image/gif' );
imagegif( $oImg );
break;
}
imagedestroy( $oImg );
}
}
}
?>
Внутри html вы можете назвать это следующим образом:
<img src='photoid.php?client_id=5a60cc8780ee6' />
то есть:
<?php
#include __DIR__ . '/db.php';
?>
<!doctype html>
<html>
<head>
<meta charset='utf-8' />
<title>Display the PHP generated image</title>
</head>
<body>
<!--
The main content on the page will be, I guess, generated using PHP
so a db lookup to get the records and render appropriate content
$res=$db->query('select * from blah');
while( $rs=$res->fetch_object() ){
echo "content
<img src='photoid.php?client_id={$rs->id}' />";
}
-->
<img src='photoid.php?client_id=5a60e11e02d18' />
</body>
</html>
client_id
в примере / демо, которое я дал, относится к моей базе данных и этим результатам. Как вы использовали выше?
<img width="400" height="200" src="<?php include ('client_display_photoid.php');?>" />
Неверно и вряд ли произведет то, на что вы надеетесь ~, хотя и без видя его содержание, трудно понять. Хранение BLOB-объектов в БД означает, что БД потенциально вырастет до непропорционально большого размера по сравнению с количеством записей. Почему плохо хранить путь к изображению?