【问题标题】:How to store an image from memory in MySQL如何在 MySQL 中存储内存中的图像
【发布时间】:2015-06-15 06:52:20
【问题描述】:

我正在尝试上传图像,更改其大小,然后将结果写入 MySQL 数据库。基本代码:

    // load original image
$image = imagecreatefromjpeg($file); // load original image

       // create new image
$newImage = imagecreatetruecolor($newWidth, $newHeight);

    // copy original to new, changing size
imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight,$origWidth, $origHeight);

    // save new image in database (in a BLOB field)
mysql_query("UPDATE myTable SET Photo='" . mysql_escape_string($newImage) . "' WHERE keyField=2");

但没有存储任何内容。 $newImage 似乎是正确大小的有效图像。我做错了什么?

【问题讨论】:

  • “什么都没有存储”是什么意思?一个空字符串?您是否尝试使用base64_encode 而不是mysql_escape_string? (顺便说一句,根据 PHP 文档,mysql_escape_string 已过时)。
  • 我的意思是更新操作后BLOB字段为0字节。我尝试过 base64_encode 的结果相同。我知道 mysql_escape_string 已过时并且正在使用 mysqli,但认为使用旧函数对于基本代码会更清晰;结果是一样的。

标签: php mysql


【解决方案1】:

作为@Wayne said。我建议将图像保存在文件系统中并将文件路径保存在数据库中
这是将图像复制到文件系统的代码

 $imagepath="C:/your/file/complete/path";
 if(isset($_FILES["file"])){
    move_uploaded_file($_FILES["file"]["tmp_name"], $imagepath);
    mysql_query("UPDATE myTable SET photo_path='" .$imagepath. "' WHERE keyField=2");
 }

编辑:如果确实需要保存在DB中,查看this详细说明

【讨论】:

  • 谢谢,但由于各种原因,将图像放入数据库是我正在做的最实用的选择。存储的图像很小,这是必要时更改大小的原因之一。
【解决方案2】:

好的,我找到了答案。基本问题是没有输出到字符串的 PHP 图像函数。然而,这可以通过操纵缓冲来规避:

ob_start();      // start buffering              
imagejpeg($newImage);   // write image to buffer
$imageString = ob_get_contents();   // retrieve buffer as string
ob_end_clean();     // clean up and close buffer
mysql_query("UPDATE myTable SET Photo='" . mysql_escape_string($imageString) . "' WHERE keyField=2");  // this now works

感谢大家的帮助。

【讨论】:

    【解决方案3】:

    如果您真的想将图像存储在数据库中,请尝试以下代码而不是最后一行:

    mysql_query("UPDATE myTable SET Photo='" . mysql_escape_string(imagejpeg($newImage)) . "' WHERE keyField=2");
    
    imagedestroy($newImage);
    

    我自己没有尝试过,所以只是一个建议。


    对您的评论进行简短编辑:

    尝试将输出存储在缓冲区中并将其用作变量,如下所示:

    ob_start();
    imagejpeg($newImage)
    $bufferImage = ob_get_clean();
    
    mysql_query("UPDATE myTable SET Photo='" . mysql_escape_string($bufferImage) . "' WHERE keyField=2");
    
    imagedestroy($newImage);
    

    参考:capture PHP output into a variable

    【讨论】:

    • 我已经尝试过了,但 imagejpeg 直接写入浏览器而不是查询。我会认为我想要实现的目标是使用 BLOB 字段的基础,无论它们是否是图像。我怀疑 $newImage 没有直接指向图像内容,但可能需要一个辅助函数才能使其进入正确的状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2017-06-20
    • 2015-02-05
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多