2010-09-09 153 views
0

我无法获得下面的代码来上传大图片。它适用于图像小于1000像素×1000像素的情况,但会打破更大的任何图像。任何帮助/想法非常感谢。PHP图片上传问题

注:我试图增加'$ memoryNeeded> = 10000000'到'7700000000',但仍然没有喜悦。

if (!$error && is_uploaded_file($_FILES['galleryFile']['tmp_name'])) { 
     $format = strtolower(substr(strrchr($_FILES['galleryFile']['name'],"."),1));    
     $str = strtolower(trim($_FILES['galleryFile']['name'])); 
     $str = preg_replace('/[^a-z0-9-]/', '-', $str); 
     $str = preg_replace('/-+/', "-", $str);  
     $filename=$str.'.'.$format;     
     $uploadGallery=$origFileDir.$filename; 
     foreach ($allowedImgFormats as $key => $value) { 
      $value==$format ? $imgFormatOK='1' : NULL; 
     } 
     $imgFormatOK=='0' ? $error='You are attempting to upload an image with an invalid format!<br />Please only upload images with ".gif", ".jpg" or ".jpeg" extensions.' : NULL; 
     if (!$error && move_uploaded_file($_FILES['galleryFile']['tmp_name'], $uploadGallery)){ 
      $galleryW='944'; $galleryH='733';       
      $galleryInfo = getimagesize($uploadGallery); 
      $memoryNeeded = Round(($galleryInfo[0] * $galleryInfo[1] * $galleryInfo['bits'] * $galleryInfo['channels']/8 + Pow(2, 16)) * 1.65); 
      if ($memoryNeeded>=10000000) { 
       unlink($uploadGallery); $error='The chosen image is too large to process.<br />Please upload a smaller image (lower dimensions and/or resolution).'; 
      } else { 
       list($wOrig, $hOrig) = getimagesize($uploadGallery); 
       $ratio_orig = $wOrig/$hOrig; 
       if ($wOrig > $galleryW) { $galleryW = $galleryH*$ratio_orig; $galleryH = $galleryW/$ratio_orig; } else { $galleryW=$wOrig; $galleryH=$hOrig; }  
       if ($galleryH > $galleryH) { $galleryH = $galleryW*$ratio_orig; $galleryW = $galleryH/$ratio_orig; } 
       $galleryP = imagecreatetruecolor($galleryW, $galleryH); 

       switch($format) { 
        case 'gif' : $thisGallery = imagecreatefromgif($uploadGallery); break; 
        case 'jpg' : $thisGallery = imagecreatefromjpeg($uploadGallery); break; 
       } 
       imagecopyresampled($galleryP, $thisGallery, 0, 0, 0, 0, $galleryW, $galleryH, $wOrig, $hOrig); 

       switch($format) { 
        case 'gif' : $createGallery=imagegif($galleryP, $galleryFileDir.$filename, 88); break; 
        case 'jpg' : $createGallery=imagejpeg($galleryP, $galleryFileDir.$filename, 88); break; 
       } 
       imagedestroy($galleryP); imagedestroy($thisGallery); unlink($uploadGallery); 

       if (!$createGallery) { 
        $error='The chosen image failed to transfer correctly.<br />Please try again, or attempt to upload an alternative image.'; 
        file_exists($galleryFileDir.'/'.$filename) ? unlink($galleryFileDir.'/'.$filename) : NULL; 
       } else {    
        $_POST['imagename']=$filename; 
        mysql_query("INSERT INTO isgallery(imagename, assoc_object) VALUES('".$_POST['imagename']."', '".$_POST['id']."')");       
       } 
      }   
     } else { 
      !$error ? $error='The chosen image failed to upload correctly.<br />Please try again, or attempt to upload an alternative image.' : NULL; 
      file_exists($uploadGallery) ? unlink($uploadGallery) : NULL; 
     } 
    } 
+0

请*总是,总是*引用您收到的错误消息。这很可能是内存问题,在这种情况下,这是一个很好的重复:http://stackoverflow.com/questions/1722352/php-memory-error-when-resizing-a-png-image – 2010-09-09 16:33:45

+0

严正,任何错误信息会好的?这是最有可能的,当你用GD处理图像时内存不足.. – halfdan 2010-09-09 16:34:29

+1

[mysql_real_escape_string()](http://php.net/mysql_real_escape_string)*咳嗽*('mysql_query(“INSERT INTO isgallery(imagename,assoc_object) VALUES(''。$ _ POST ['imagename']。'','“。$ _ POST ['id']。”')“);') – Lekensteyn 2010-09-09 16:36:10

回答

0

一个1000×1000的图像,需要在最不 3000000字节的内存,如果你正在处理的真实色彩。如果你正在做Alpha透明度,则为4,000,000。如果您的$memoryNeeded变量设置为大于PHP的memory_limit,则该变量无用。它会愉快地尝试创建一个图像,并因超出限制而失败。

您可以检查ini_get('memory_limit')的限制,尽管您很可能无法直接将此值用于没有按摩的计算,因为它可能会返回类似'32M'(32兆字节限制) ,而不是33554432

+0

感谢您的回复。检查内存限制,它回来为128M!? – ss888 2010-09-10 08:14:51

+0

好的,应该有足够的内存来处理图像。检查你的计算是否正确。记录/回显$ galleryW和$ galleryH以确保您不会创建令人难以置信的巨大新图像。然后开始在函数的各个阶段放入调试语句,以确切地查看它在哪里死亡。可能是一些其他问题,如腐败的图像。 – 2010-09-10 13:08:35

+0

将尝试。非常感谢。 – ss888 2010-09-10 16:14:24