0

我正在尝试编写一个函数来处理 mySQL / PHP 中的图像,但无法弄清楚如何存储结果。我已经包含了一个精简版本的代码来演示这个问题。

image.image_o 中的 blob 均已正确存储,可用于将图像输出到网页。该函数运行没有错误,但之后 image.image_r 中的 blob 只有几个字节长,并且包含诸如“Resource id #5”之类的文本

我确信我在做一些愚蠢的事情——只是看不到它是什么。

function process_images(){
    global $mysql
    $sql = "select id, image_o from image";
    $res = mysqli_query($mysqli, $sql);
    if ($res){
        while ($ay = mysqli_fetch_array($res, MYSQLI_ASSOC)){
             $id = $ay['id'];
             $im = imagecreatefromstring($ay['image_o']);
             // do something useful with the image
             $sql2 = "update image set image_r = '{$im}' where id = $id";
             $res2 = mysqli_query($mysqli, $sql2);
             if ($res2){
                 // blah blah
             }else{
                 echo mysqli_error($mysqli)." in res2";
             }
         }
    }else{
        echo mysqli_error($mysqli)." in res"; 
    }
}
4

1 回答 1

0

我同意上面的评论,认为这通常是不可取的。但是,这是一篇很棒的文章,介绍了为什么要这样做以及如何做。它还强调了在数据库中存储图像的一些缺点。

http://forum.codecall.net/topic/40286-tutorial-storing-images-in-mysql-with-php/

您需要确保将数据读入该字段。不仅仅是文件指针:

// Temporary file name stored on the server
$tmpName  = $_FILES['image']['tmp_name'];  

// Read the file 
$fp     = fopen($tmpName, 'r');
$data = fread($fp, filesize($tmpName));
$data = addslashes($data);
fclose($fp);

// Now take the contents of data and store THAT

简而言之,imagecreatefromstring 返回“成功时将返回图像资源”,而不是文件本身的内容。您需要先阅读该资源的内容,然后才能存储它。使用您的代码,进行以下更改:

function process_images(){
    global $mysql
    $sql = "select id, image_o from image";
    $res = mysqli_query($mysqli, $sql);
    if ($res){
        while ($ay = mysqli_fetch_array($res, MYSQLI_ASSOC)){
             $id = $ay['id'];
             $im = imagecreatefromstring($ay['image_o']);
             $tempFileName = '/tmp/' . $id . 'jpg';
             $imTempFile = imagegd($im, $tempFileName); 
             $fh = fopen($tempFileName, "r");
             $data = fread($fh, filesize($tempFileName));

             // do something useful with the image
             $sql2 = "update image set image_r = '{$data}' where id = $id";
             $res2 = mysqli_query($mysqli, $sql2);
             if ($res2){
                 // blah blah
             }else{
                 echo mysqli_error($mysqli)." in res2";
             }
             //delete the temp file
             unlink($tempFileName);
         }
    }else{
        echo mysqli_error($mysqli)." in res"; 
    }
}
于 2012-10-30T22:15:37.650 回答