在上传图片代码php中找不到错误 [英] Can't find mistake in upload image code php

查看:66
本文介绍了在上传图片代码php中找不到错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在php中实现图片上传.我浏览了一些文章,但是在代码中找不到错误. websitename/upload_avatar.php出现在地址栏中,但是图像的路径未出现在MySQL表中.怎么了?

I am trying to implement image upload in php. I have looked through some articles, but I can't find mistake in my code. websitename/upload_avatar.php appears in address bar, but path of image doesn't appear in MySQL table. What is wrong here?

HTML表单:

  <form action="upload_avatar.php" method="post" enctype="multipart/form-data">
  <input type="FILE" onchange="this.form.submit()"  name="ava" value=""></form>

upload_avatar.php中:

<?php
     include ("bd.php");
     if (empty($_FILES['ava']['name']))
     {
    $avatar = "avatars/default.jpg"; 
     }
     else
    {
    $path_directory = 'avatars/';
    if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['ava']['name']))
    { 
    $filename = $_FILES['ava']['name'];
    $source = $_FILES['ava']['tmp_name'];
    $target = $path_directory . $filename;
    move_uploaded_file($source, $target);

     if(preg_match('/[.](GIF)|(gif)$/', $filename)) {
     $im = imagecreatefromgif($path_directory.$filename) ;
     }
      if(preg_match('/[.](PNG)|(png)$/', $filename)) {
      $im = imagecreatefrompng($path_directory.$filename) ;
      }  

        if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {

        $im = imagecreatefromjpeg($path_directory.$filename);
     }
    $w = 150;
    $w_src = imagesx($im); 
    $h_src = imagesy($im); 
    $dest = imagecreatetruecolor($w,$w);
    if ($w_src>$h_src)

             imagecopyresampled($dest, $im, 0, 0,

             round((max($w_src,$h_src)-min($w_src,$h_src))/2),

             0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));


    if ($w_src < $h_src)

             imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,

             min($w_src,$h_src), min($w_src,$h_src));
             if ($w_src==$h_src)

             imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);





    $date=time();



    imagejpeg($dest, $path_directory.$date.".jpg");



    $avatar = $path_directory.$date.".jpg";



    $delfull = $path_directory.$filename;

    unlink ($delfull);


    $result = mysql_query ("INSERT INTO users (avatar) VALUES('$avatar')");

    }

    else

    {





    exit ("Image must be <strong>JPG,GIF or PNG</strong>");

     }


    }


    ?>

推荐答案

这是一个非常健壮的例程,可创建2张预览图像并且很大.

This is a very robust routine that creates 2 images preview and big.

它还会检查3种图像类型以获得最小的输出.我不在乎图像是哪种格式,因为我将其以HTML格式放置在base64的HTML页面中.

It also checks the 3 image types for the smallest output. I do not care what format the image is as I put it in the HTML page as base64.

它还将图像转换为base64并将它们保存在SQL表中,并将base64图像保存到HTML页面.

It also converts the images to base64 and save them in an SQL table and save the base64 image to an HTML page.

在缩放图片时会显示以供查看.

While it does the scaling the pics are displayed for review.

您似乎对此有足够的了解,可以理解我的代码.

You seem to have enough knowledge about this to understand my code.

我可以发表评论.

$thumbWidth = 60;
$thumbHeight = 60;  
$previewWidth = 200;
$previewHeight = 150;
$bigWidth = 800;
$bigHeight = 600;


if( is_uploaded_file($_FILES['ava']['tmp_name']) || !($_FILES['ava']['error'] !== UPLOAD_ERR_OK)){
  $save = false;
  $jspan = '';
  $gspan = '';
  $pspan = '';

通过MIME类型获取图像的类型.

然后使用imagecreatefrom

不管扩展名,MIME类型如何,如果它是jpg,png或gif图像,它将肯定地标识类型.

  switch(strtolower($_FILES['ava']['type'])){
  case 'image/jpeg':
    $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
    if ($image !== false){$save = true;break;}
  case 'image/png':
    $image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
    if ($image !== false){$save = true;break;}
  case 'image/gif':
    $image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
    if ($image !== false){$save = true;break;}
  default:
    $img = @getimagesize($_FILES['ava']['tmp_name']);
    switch(strtolower($img['mime'])){
    case 'image/jpeg':
      $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
      if ($image !== false){$save = true;break;}
    case 'image/png':
      $image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
      if ($image !== false){$save = true;break;}
    case 'image/gif':
      $image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
      if ($image !== false){$save = true;break;}
    default:
      $filename = $_FILES['ava']['name'];
      $ext = substr($filename,-3);
      switch(strtolower($ext)){
      case 'jpg':
        $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
        if ($image !== false){$save = true;break;}
      case 'gif':
        $image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
        if ($image !== false){$save = true;break;}
      case 'png':
        $image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
        if ($image !== false){$save = true;break;}
      default:
        $image = @imagecreatefromjpeg($_FILES['ava']['tmp_name']);
        if ($image !== false){$save = true;break;}
        $image = @imagecreatefrompng($_FILES['ava']['tmp_name']);
        if ($image !== false){$save = true;break;}
        $image = @imagecreatefromgif($_FILES['ava']['tmp_name']);
        if ($image !== false){$save = true;break;}
      }
    }
  }
}

缩放为预览大小

 if ($save === true){
  $originalWidth  = imagesx($image);
  $originalHeight = imagesy($image);
  $scale      = min($previewWidth/$originalWidth, $previewHeight/$originalHeight);
  $newWidth  = ceil($scale*$originalWidth);
  $newHeight = ceil($scale*$originalHeight);
  $newPic = imagecreatetruecolor($newWidth, $newHeight);
  imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight);
  ob_start();
  imagejpeg($newPic, NULL, 70);
  $jpg = ob_get_clean();
  ob_clean();
  ob_end_flush();
  $jLen = strlen($jpg);
  ob_start();
  imagepng($newPic, NULL, 9);
  $png = ob_get_clean();
  ob_clean();
  ob_end_flush();
  $pLen = strlen($png);
  ob_start();
  imagegif($newPic);
  $gif = ob_get_clean();
  ob_clean();
  ob_end_flush();

检查哪种图像类型创建的字节数最少

  $gLen = strlen($gif);
  if ($gLen < $jLen){
    if ($pLen < $gLen){
      $raw = $png;
      $png = null;
      $type = 'png';
      $pspan = '<span class="size">';
    }
    else{
      $raw = $gif;
      $gif = null;
      $type = 'gif';
      $gspan = '<span class="size">';
    }
  }
  elseif($pLen < $jLen){
    $raw = $png;
    $png = null;
    $type = 'png';
    $pspan = '<span class="size">';
  }
  else{
    $raw = $jpg;
    $jpg = null;
    $type = 'jpg';
    $jspan = '<span class="size">';
  }

转换为bas64并保存

我在HTML页面中使用base64图像.它消除了每个图像的HTTP往返行程.

I use base64 images in my HTML pages. It eliminates HTTP round trip for each image.

反对者抱怨base64将图像大小增加了30%.而且确实如此.

The naysayers complain base64 adds 30% to the image size. And it does.

将base64嵌入HTML时,它会被压缩.而额外的30%会被gzip压缩到更少,通常只有几个百分点.

When the base64 is embedded in the HTML, it get zgipped. And the extra 30% is compressed by gzip to much less, typicality only a few percent.

HTTP往返行程因服务器而异,一天中的时间等有所不同,但通常为200毫秒. base64的传输时间通常只有几毫秒.

An HTTP Round trip varies from server to server, time of day etc. but typically 200 milliseconds. The transmission time of the base64 is usually just a few milliseconds.

  $base64 = base64_encode($raw);
  $thumb1 = "<img  width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\"  alt =\"profile thumb one\"/>";
  $size = 'Thumb';
  echo  "<p>Image $num $size <br>$jspan jpg: $jLen bytes</span>, <br>$gspan gif: $gLen bytes</span>, <br>$pspan png: $pLen bytes</span></p> $thumb1"; 
  $filename = 'thumb1.' . $type;
  $fp = fopen($filename  ,"w");
  fwrite($fp, $raw);
  fclose($fp);
  imagedestroy($newPic);
  $filename = "thumb1_$type.html";
  $fp = fopen($filename  ,"w");
  fwrite($fp, $thumb1);
  fclose($fp);
  $thumb1 = mysql_escape_string($thumb1);
  @mysql_unbuffered_query("UPDATE `photos` SET `thumb1`='$thumb1' WHERE `id`=$id");

缩放为大图:

  $scale      = min($bigWidth/$originalWidth, $bigHeight/$originalHeight);
  $newWidth  = ceil($scale*$originalWidth);
  $newHeight = ceil($scale*$originalHeight);
  $newPic = imagecreatetruecolor($newWidth, $newHeight);
  imagecopyresampled($newPic, $image,0, 0, 0, 0,$newWidth, $newHeight, $originalWidth, $originalHeight);
  ob_start();
  imagejpeg($newPic, NULL, 70);
  $jpg = ob_get_clean();
  ob_clean();
  ob_end_flush();
  $jLen = strlen($jpg);
  ob_start();
  imagepng($newPic, NULL, 9);
  $png = ob_get_clean();
  ob_clean();
  ob_end_flush();
  $pLen = strlen($png);
  ob_start();
  imagegif($newPic);
  $gif = ob_get_clean();
  ob_clean();
  ob_end_flush();
  $gLen = strlen($gif);
  if ($gLen < $jLen){
    if ($pLen < $gLen){
      $raw = $png;
      $png = null;
      $type = 'png';
      $pspan = '<span class="size">';
    }
    else{
      $raw = $gif;
      $gif = null;
      $type = 'gif';
      $gspan = '<span class="size">';
    }
  }
  elseif($pLen < $jLen){
    $raw = $png;
    $png = null;
    $type = 'png';
      $pspan = '<span class="size">';
  }
  else{
    $raw = $jpg;
    $jpg = null;
    $type = 'jpg';
    $jspan = '<span class="size">';
  }
  $base64 = base64_encode($raw);
  $size = 'Full Size';
  $filename = 'big1.' . $type;
  $big1 = "<img  width=\"$newWidth\" height=\"$newHeight\" src=\"data:image/$type;base64,$base64\" alt =\"profile photo one\"/>";
  echo  "<p>Image $num $size <br>$jspan jpg: $jLen bytes</span>, <br>$gspan gif: $gLen bytes</span>, <br>$pspan png: $pLen bytes</span></p> $big1"; 
  $fp = fopen($filename  ,"w");
  fwrite($fp, $raw);
  fclose($fp);
  imagedestroy($newPic);
  $filename = "big1_$type.html";
  $fp = fopen($filename  ,"w");
  fwrite($fp, $big1);
  fclose($fp);
  $big1 = mysql_escape_string($big1);
  @mysql_unbuffered_query("UPDATE `photos` SET `big1`='$big1' WHERE `id`=$id");

这篇关于在上传图片代码php中找不到错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆