我正在为客户关系管理构建一个内部应用程序。
此应用程序相当直接。它收集客户信息并存储以供以后使用。
收集的信息的一部分是客户照片识别的图像。我将此图像存储在mySQL数据库中的自己的表中。
我一直在寻找一种在客户信息(名称,地址等)旁边的小预览窗口中显示图像的方法。我找到的可能的解决方案是非常陈旧和折旧,或者指的是显示一个图像,其中只有文件的URL存储在数据库中,图像本身保存在服务器上的文件夹中。
我目前拥有的代码不会在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');?>
编辑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," />
编辑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' />
答案 0 :(得分:0)
以下内容应该有助于为您排序 - 数据库将base64编码数据存储为blob并使用php和imagecreatefromstring
动态创建图像。以下代码在测试中对我有用,因此您应该能够修改它以在您的环境中工作。一个区别是在db中使用整数mimetype而不是字符串。
上面的$ mime是一个整数,但在返回的值上使用image_type_to_mime_type
将产生mime类型字符串..这只是意味着你必须修改该位以使用字符串而不是整数。
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>
答案 1 :(得分:0)
我今天搞砸了这一堆,并发现将我的PHP改为以下允许我在HTML中使用简单的PHP INCLUDE来根据需要显示图像。
看起来WHILE声明就是这个伎俩。我还使用了一些提供的建议,并利用了PHP代码中的ECHO-ing HTML。
非常感谢所有评论和帮助的人。
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');
}
?>