【问题标题】:Images stored in database are cut/cropped when displayed on browser存储在数据库中的图像在浏览器上显示时会被剪切/裁剪
【发布时间】:2013-08-12 21:05:02
【问题描述】:

我正在尝试显示来自 mysql 数据库的图像。有些图像显示正确,但有些图像在底部显示为剪切/裁剪,裁剪部分仅显示为空白,因为它成为图像的一部分,您真的无法摆脱。

CSS 无法解决这个问题,并且使用 imagecreate 等在旅途中重新创建图像不会恢复它。我将元标记设置为 utf-8。根据我的阅读,这可能与 utf-8 bom 左右有关。我基本上使用 file_get_contents 或 fopen 和 fread 来获取图像并将它们存储在数据库中并使用 header() 或 base64_encode 输出它们。但是我这样做,我得到相同的结果。

这是到浏览器的基本输出图像代码:

//html form
<form action='' method='post' enctype='multipart/form-data'>
<input type='file' name='image' size='10'>
<input type='submit' name='submit_image' value='Upload' />
</form> 

//table creation
$my_photos = "CREATE TABLE IF NOT EXISTS photos (
id bigint NOT NULL auto_increment,
pic blob NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB";

if (mysql_query($my_photos)){
print "Success in photo TABLE creation!";
} else {
print "no photos TABLE created. Debug code!";
}

//get image
$uploaded_image = $_FILES['image'];
$image_tmp = $uploaded_image['tmp_name'];    
$image = file_get_contents($image_tmp); 

//connect and submit image to database
mysql_connect("server","username","password");
mysql_select_db("database");
mysql_query("INSERT IGNORE INTO photos (id, pic) values ('', '".$image."') "); 

//get image from database and output it
$image_query = mysql_query("SELECT * FROM photos WHERE id=1 ");
$image = mysql_fetch_array($image_query);   
header("Content-type: image/jpg/jpeg/gif/png/bmp/JPG");    
echo $image['pic'];

有没有人遇到过类似的问题,他们是如何解决的?

(我的应用程序中的某些图像确实使用文件系统,但在这种情况下需要 blob)。

非常感谢任何帮助。

【问题讨论】:

  • 显示创建表语句?以及更多将照片上传到数据库中的 php 代码?并且使用带有 blob 列的数据库来存储大型二进制数据是 MySQL 的真正性能杀手
  • 感谢雷蒙德的快速回复。添加了更多代码,希望对您有所帮助
  • 你在 mysql 中的默认字符集是 latin1 还是 utf8?
  • 默认是utf8_general_ci
  • 好吧,我仍然缺少构建表单的 html。

标签: database image cut


【解决方案1】:

在 PHP 中处理来自 Web 客户端的 UTF-8 数据很困难,您需要做很多事情。

首先你需要确定你的html页面是否

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

在您的网页中

改变你的

<form action='' method='post' enctype='multipart/form-data'>

add accept-charset=UTF-8 is not be correcly shown here see the edit of this post to see the html code..

如果这是php生成的还要加上

header('Content-Type: text/html; charset=utf-8');

在顶部

连接数据库后直接运行

mysql_set_charset('utf8')

告诉 php mysql 客户端使用 UTF-8 而不是 latin1 进行连接。

我认为您需要将照片保存为 base64_encoded 字符串以保持数据正确。

一些额外的补充说明来修复

1) 不要使用 mysql_annymore 而是使用 mysqli_ 2) html代码将html属性中的(')改为(")

【讨论】:

  • 谢谢雷蒙德。除了表单中的 accept-charset='UFT-8' 之外,我实际上已经尝试了所有这些但没有取得多大成功。但是,如果它已经在元标记中设置,似乎不会有太大的不同。有趣的是,问题根本没有消失。我似乎不明白为什么它适用于某些图像,但不适用于其他图像。
  • 嘿雷蒙德,刚刚尝试了最简单的解决方案,我应该首先拥有它。不过,经过几天的研究等,从中学到了很多东西。我只需要将 blob 更改为 mediumblob 或 longblob。猜猜角色对于blob来说太多了。有趣的是,即使是更大的图像尺寸也没有问题,这让我很快排除了文件大小。
  • 如果您使用 uft8,您应该始终按照我所说的步骤进行操作。 true blob 存储在 utf8 中时也可以存储几个字节。因为您需要将最大字节数除以 3,因为 utf8 可以将 char 存储在三个字节中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2015-01-23
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多