PHP图像不会上传到服务器

时间:2016-07-18 17:08:18

标签: php file-upload

我在将图片上传到服务器时遇到问题(首先我将其转换为.png并调整其大小):

在functions.php中

function imageUploadedResize($source, $target,$nWidth, $nHeight)
{

   $sourceImg = Imagecreatefromstring(file_get_contents($source));
   if ($sourceImg === false)
   {
      return false;
   }
   $width = imagesx($sourceImg);
   $height = imagesy($sourceImg);
   $targetImg = imagecreatetruecolor($nWidth, $nHeight);
   imagecopyresized($targetImg, $sourceImg, 0, 0, 0, 0, $nWidth,$nHeight,$width, $height);
   imagedestroy($sourceImg);
   imagepng($targetImg, $target);
   imagedestroy($targetImg);
}

在uploadtoServer.php

if(isset($_POST["fileToUpload"]))
    {
    $target_dir = "img/data/";
    $fn = $_FILES['fileToUpload']['tmp_name'];
    $newFileName = mysqli_insert_id($link).".png";
    header('Content-type: image/png');
    imageUploadedResize($fn, $target_dir.$newFileName, 45,60);
    }

如果我将$ fn更改为静态图像,例如" https://pbs.twimg.com/profile_images/54789364/JPG-logo-highres.jpg"它的工作原理我觉得我在$ fn有问题。有什么想法可以吗?

1 个答案:

答案 0 :(得分:2)

第1部分:

表格输入

正如Johnathan所提到的,当文件上传表单提供isset($_POST["fileToUpload"])数组中的值时,您正在检查$_FILES。因此,您需要将引用从$_POST更改为$_FILES,否则它将始终返回false。

编辑:由于您的评论声明您获得100%错误,因此您应该使用更具体的限定符,例如if($_FILES['fileToUpload']['error'] == 0)

提交数据的HTML表单需要为enctype="multipart/form-data",否则您的服务器将不会从您的表单中收集任何形状的文件。还需要在POST方法中设置HTML表单。

第2部分

文件存储:

您对图像的文件系统存储的引用(例如$target_dir = "img/data/";)是相对的,因此这意味着$target_dir的值必须是调用该脚本块的文件的子级。

使用绝对文件系统引用可能对您有很大帮助,通常(但不是唯一)使用$_SERVER['DOCUMENT_ROOT']."/img/data"; 此示例将数据存储在www.your-web-site.com/img/data位置。

第3部分

显示图像。

您有一个标题设置内容类型为image/png,但您实际上并未输出图像,而是将其保存到上面提到的文件参考中。如果您想输出图像到浏览器,您需要跳过保存它:

imagepng($targetImg, NULL); 

然后将$targetImg中的图像直接输出到浏览器。目前您似乎保存显示它,尽管设置了图像标题,这意味着对浏览器的任何输出都应该是图像内容。

某些 系统对新上传的数据有限制并防止数据处理过于自由,为了解决这个问题,建议使用move_upladed_file将文件保存到“正确”的目标,然后访问它以输出到浏览器。

进一步说明:

  • 您应该在对文件执行操作之前检查$_FILES['fileToUpload']['error'],因为这会告诉您文件是否存在。使用isset是一个糟糕的(非常含糊的)想法,因为即使文件尚未上传,仍然可以设置数组。

  • 您应该使用PHP error logging。您不应该使用错误抑制@