我的 PHP 脚本无法上传 50M 以上的图片

Posted

技术标签:

【中文标题】我的 PHP 脚本无法上传 50M 以上的图片【英文标题】:My PHP script fails uploading 50M above images 【发布时间】:2015-02-20 12:25:13 【问题描述】:

我必须上传 75MB(JPEG 和 PNG)的图像。出现这样的错误:

(致命错误:内存不足(已分配-1912078336)(试图分配30000字节)

如果我上传 40+、50+ 以上的 png 或 jpeg。

在这一步$new_image = imagecreatetruecolor($width, $height); 如果我上传 30+ JPG 图片我会收到错误:

致命错误:内存不足(已分配-1910767616)(试图分配43200字节)

我还在 php 值下方的 .htaccess 中添加:

php_value upload_max_filesize 2000M
php_value max_input_time 1000
php_value memory_limit 2000M
php_value max_execution_time 20000
php_value post_max_size 2000M

这是脚本:

<?php
set_time_limit(300);
ini_set('memory_limit', '64800M');
ini_set("max_execution_time",10000);
ini_set ("display_errors", "1");
error_reporting(E_ALL);

$target_dir = "uploads/";
$unq_name=(mt_rand(10,1000));
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);

$source_photo = 'uploads/'.basename( $_FILES["fileToUpload"]["name"]);
$dest_photo = 'uploads/testing_'.$unq_name.'.'.$imageFileType;


$image = new SimpleImage(); 
$image->load($source_photo);
$image->scale(50);
$image->save($dest_photo); 


class SimpleImage    
var $image; var $image_type;   
function load($filename)   
            $image_info = getimagesize($filename); 
            $this->image_type = $image_info[2]; 
            if( $this->image_type == IMAGETYPE_JPEG ) 
               
             $this->image = imagecreatefromjpeg($filename);
              
             elseif( $this->image_type == IMAGETYPE_GIF ) 
                
             $this->image = imagecreatefromgif($filename); 
              
             elseif( $this->image_type == IMAGETYPE_PNG )
              
             $this->image = imagecreatefrompng($filename);
              

function save($filename, $image_type=IMAGETYPE_JPEG, $compression=70, $permissions=null) 

            image_type=$this->image_type;

          if( $image_type == IMAGETYPE_JPEG )
          
             imagejpeg($this->image,$filename,$compression);
           
          elseif( $image_type == IMAGETYPE_GIF ) 
          
             imagegif($this->image,$filename);  
           
          elseif( $image_type == IMAGETYPE_PNG )
           
            imagealphablending($this->image, false);
            imagesavealpha($this->image,true);
            imagepng($this->image,$filename);
             
          if( $permissions != null) 
             chmod($filename,$permissions);
          
  

function output($image_type=IMAGETYPE_JPEG)

   if( $image_type == IMAGETYPE_JPEG )
    
       imagejpeg($this->image);
    
     elseif( $image_type == IMAGETYPE_GIF ) 
      
     imagegif($this->image);
       
     elseif( 
     $image_type == IMAGETYPE_PNG )
        
     imagepng($this->image); 
      
 
function getWidth()
  
          return imagesx($this->image); 
 
function getHeight()   
           return imagesy($this->image);        

function resizeToHeight($height)
   
       $ratio = $height / $this->getHeight(); 
       $width = $this->getWidth() * $ratio; 
       $this->resize($width,$height);
 
function resizeToWidth($width)
 
             $ratio = $width / $this->getWidth(); 
             $height = $this->getheight() * $ratio; 
             $this->resize($width,$height);
   
function scale($scale) 
 
         $width = $this->getWidth() * $scale/100; 
         $height = $this->getheight() * $scale/100; 
         $this->resize($width,$height);
  

function resize($width,$height) 
   

              $new_image = imagecreatetruecolor($width, $height); 
                if( $this->image_type == IMAGETYPE_GIF || $this->image_type == IMAGETYPE_PNG) 
                 
                                          $current_transparent = imagecolortransparent($this->image);
                                            if($current_transparent != -1) 
                                             
                                            $transparent_color = imagecolorsforindex($this->image, $current_transparent); 
                                            $current_transparent = imagecolorallocate($new_image, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); 
                                            imagefill($new_image, 0, 0, $current_transparent); 
                                            imagecolortransparent($new_image, $current_transparent); 
                                             
                                            elseif( $this->image_type == IMAGETYPE_PNG) 
                                            
                                                 imagealphablending($new_image, false); 
                                                 $color = imagecolorallocatealpha($new_image, 255, 255, 255, 127); 
                                                 imagefill($new_image, 0, 0, $color); imagesavealpha($new_image, true);
                                             
                                     
                                 imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); 
                                 $this->image = $new_image;

                 
  

?>

【问题讨论】:

您可能需要在 php.ini 配置中更改内存限制,请参阅 ***.com/questions/6314733/… ^ 他已经这样做了。试试这个 Vasanth:ini_set('memory_limit', -1); 调整图像大小所需的内存也取决于图片的分辨率。要调整 3000 x 3000 图片的大小,您需要大约 50MB 内存才能做到这一点 我几乎重写了你的帖子。我已经添加了代码(我们更喜欢外部链接),引入了 php.ini 设置更改,并重新格式化它以使其可读。如果你能把你的帖子做成和上面类似的样子,那就可以为编辑们省下不少工作了!谢谢。 让我试试这个 "ini_set('memory_limit', -1);" 【参考方案1】:

请更改您的 php.ini 设置。

找线:

upload_max_filesize = 100M
post_max_size = 100M

如果您有共享主机,您应该告诉管理员尚未使用 cpanel 等,请从控制面板执行此操作,另请参阅 here 和 here

请在创建新问题之前进行搜索。Google 是您的朋友。

【讨论】:

任何建议请上传 jpeg:40MB, PNG:50MB。但我需要上传最大 75MB 的图片大小。

以上是关于我的 PHP 脚本无法上传 50M 以上的图片的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 上传图片并达到脚本内存限制

PHP图片上传安全检查清单

完整的安全图像上传脚本

为啥我的php脚本上传应该是图像的空白文件

文件上传漏洞

Android:无法使用 php 脚本将图像上传到远程 MySql DB