在保存到 MySQL 数据库之前调整图像大小

Posted

技术标签:

【中文标题】在保存到 MySQL 数据库之前调整图像大小【英文标题】:Resize image before saving to MySQL database 【发布时间】:2013-05-09 15:57:43 【问题描述】:

我的问题类似于this one,但我被困在最后一点!

以下代码获取 html 表单发送的文件,并根据两个预定义值 $maxwidth$maxheight 检查其尺寸。如果它太宽,它会调整图像的大小。

我接下来要做的就是将新调整大小的图像重新分配给原始变量$tmpName,以便脚本的其余部分可以处理它。

以下代码返回这些错误:

Warning: fopen() expects parameter 1 to be string, resource given in /var/www/vhosts/galleryimaginem.com/httpdocs/img/upload.php on line 43

Warning: filesize() [function.filesize]: stat failed for Resource id #4 in /var/www/vhosts/galleryimaginem.com/httpdocs/img/upload.php on line 44

Warning: fread(): supplied argument is not a valid stream resource in /var/www/vhosts/galleryimaginem.com/httpdocs/img/upload.php on line 44

Warning: fclose(): supplied argument is not a valid stream resource in /var/www/vhosts/galleryimaginem.com/httpdocs/img/upload.php on line 46

我想我已经很接近了,但有人可以帮忙吗?谢谢。

if (isset($_FILES['image']) && $_FILES['image']['size'] > 0)  

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

            list($width,$height)=getimagesize($tmpName);

            if ($width>$height && $width>$maxwidth) 
                $newheight=($height/$width)*$maxwidth;
                $newwidth=$maxwidth;
                $imageResized = imagecreatetruecolor($newwidth, $newheight);
                $imageTmp     = imagecreatefromjpeg ($tmpName);
                imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
                $tmpName=$imageResized;

                // My problem lies somewhere here ^^^^
            

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


      // Create the query and insert
      // into our database.
      $query = "INSERT INTO tblPrints ";
      $query .= "(title,full_image) VALUES ('IMG-TEST','$data')";
      $results = mysql_query($query, $link);

      // Print results
      print "Thank you, your file has been uploaded.";


else 
   print "No image selected/uploaded";

【问题讨论】:

而不是将其分配给 $imgTmp 变量,而是将其分配给 $tmpName 简单 你到底是什么意思,亚西尔? 在处理你分配给一个新的变量 $imageTmp 只需继续 $tmpName 这样你的变量的名称就不会改变,你可以用相同的名称处理它。 在使用 fopen 打开文件后尝试转义(使用 mysql_real_escape())$tmpName。 $tmpName 包含名称为字符串,但 imagecreatetruecolor 返回图像对象的资源句柄。两种完全不同的类型。只需在重新采样到新文件后再次保存调整大小的图像,并将其路径用作 $tmpName 中的字符串。 【参考方案1】:

第 6-17 行将文件名替换为图像数据本身 - 这就是

Warning: fopen() expects parameter 1 to be string, resource given

所以在接下来的几行中,

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

您无需阅读该文件。如果条件过程已经执行,你只需要

$data = $tmpname // sounds strange, remember: $tmpname is not the name any more

【讨论】:

所以,更详细地说,脚本在删除第 6-17 行时起作用。也就是说可以处理原始上传(存储在$_FILES[])并成功添加到数据库中。发生的情况是,在第 14 行,当这些代码行更改变量时,现在以后续编码无法解释的方式引用新图像。谁能看到我在这里遗漏或做错了什么?谢谢! 呃...我完全误解了你的第 6-17 行。我会彻底修改答案。

以上是关于在保存到 MySQL 数据库之前调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

Android在保存到SD卡之前拍照并调整大小

php 魔术师调整大小 - 显示图像而不是保存到文件夹

如何在 Laravel 中调整图像大小并同时将数据保存在数据库中

kohana 3.0 在上传之前调整图像大小?

检索、调整大小并将图像保存回 Access 数据库图像字段

在调整图像大小时保留 exif 数据