2017-09-03 81 views
1

當我嘗試調整正在上傳的臨時文件時,遇到了一些問題。調整上傳的多張圖片無法正常工作

我使用以下ResizeImage.php類:

class ResizeImage { 
    // *** Class variables 
    private $image; 
    private $width; 
    private $height; 
    private $imageResized; 

    function __construct($fileName) 
    { 
     // *** Open up the file 
     $this->image = $this->openImage($fileName); 

     // *** Get width and height 
     $this->width = imagesx($this->image); 
     $this->height = imagesy($this->image); 
    } 

    ## -------------------------------------------------------- 

    private function openImage($file) 
    { 
     // *** Get extension 
     $extension = strtolower(strrchr($file, '.')); 

     switch($extension) 
     { 
      case '.jpg': 
      case '.jpeg': 
       $img = @imagecreatefromjpeg($file); 
       break; 
      case '.gif': 
       $img = @imagecreatefromgif($file); 
       break; 
      case '.png': 
       $img = @imagecreatefrompng($file); 
       break; 
      default: 
       $img = false; 
       break; 
     } 
     return $img; 
    } 

    ## -------------------------------------------------------- 

    public function processImage($newWidth, $newHeight, $option="auto") 
    { 
     // *** Get optimal width and height - based on $option 
     $optionArray = $this->getDimensions($newWidth, $newHeight, $option); 

     $optimalWidth = $optionArray['optimalWidth']; 
     $optimalHeight = $optionArray['optimalHeight']; 


     // *** Resample - create image canvas of x, y size 
     $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); 
     imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); 


     // *** if option is 'crop', then crop too 
     if ($option == 'crop') { 
      $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight); 
     } 
    } 

    ## -------------------------------------------------------- 

    private function getDimensions($newWidth, $newHeight, $option) 
    { 

     switch ($option) 
     { 
      case 'exact': 
       $optimalWidth = $newWidth; 
       $optimalHeight= $newHeight; 
       break; 
      case 'portrait': 
       $optimalWidth = $this->getSizeByFixedHeight($newHeight); 
       $optimalHeight= $newHeight; 
       break; 
      case 'landscape': 
       $optimalWidth = $newWidth; 
       $optimalHeight= $this->getSizeByFixedWidth($newWidth); 
       break; 
      case 'auto': 
       $optionArray = $this->getSizeByAuto($newWidth, $newHeight); 
       $optimalWidth = $optionArray['optimalWidth']; 
       $optimalHeight = $optionArray['optimalHeight']; 
       break; 
      case 'crop': 
       $optionArray = $this->getOptimalCrop($newWidth, $newHeight); 
       $optimalWidth = $optionArray['optimalWidth']; 
       $optimalHeight = $optionArray['optimalHeight']; 
       break; 
     } 
     return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); 
    } 

    ## -------------------------------------------------------- 

    private function getSizeByFixedHeight($newHeight) 
    { 
     $ratio = $this->width/$this->height; 
     $newWidth = $newHeight * $ratio; 
     return $newWidth; 
    } 

    private function getSizeByFixedWidth($newWidth) 
    { 
     $ratio = $this->height/$this->width; 
     $newHeight = $newWidth * $ratio; 
     return $newHeight; 
    } 

    private function getSizeByAuto($newWidth, $newHeight) 
    { 
     if ($this->height < $this->width) 
     // *** Image to be resized is wider (landscape) 
     { 
      $optimalWidth = $newWidth; 
      $optimalHeight= $this->getSizeByFixedWidth($newWidth); 
     } 
     elseif ($this->height > $this->width) 
     // *** Image to be resized is taller (portrait) 
     { 
      $optimalWidth = $this->getSizeByFixedHeight($newHeight); 
      $optimalHeight= $newHeight; 
     } 
     else 
     // *** Image to be resizerd is a square 
     { 
      if ($newHeight < $newWidth) { 
       $optimalWidth = $newWidth; 
       $optimalHeight= $this->getSizeByFixedWidth($newWidth); 
      } else if ($newHeight > $newWidth) { 
       $optimalWidth = $this->getSizeByFixedHeight($newHeight); 
       $optimalHeight= $newHeight; 
      } else { 
       // *** Sqaure being resized to a square 
       $optimalWidth = $newWidth; 
       $optimalHeight= $newHeight; 
      } 
     } 

     return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); 
    } 

    ## -------------------------------------------------------- 

    private function getOptimalCrop($newWidth, $newHeight) 
    { 

     $heightRatio = $this->height/$newHeight; 
     $widthRatio = $this->width/$newWidth; 

     if ($heightRatio < $widthRatio) { 
      $optimalRatio = $heightRatio; 
     } else { 
      $optimalRatio = $widthRatio; 
     } 

     $optimalHeight = $this->height/$optimalRatio; 
     $optimalWidth = $this->width/$optimalRatio; 

     return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); 
    } 

    ## -------------------------------------------------------- 

    private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight) 
    { 
     // *** Find center - this will be used for the crop 
     $cropStartX = ($optimalWidth/2) - ($newWidth /2); 
     $cropStartY = ($optimalHeight/ 2) - ($newHeight/2); 

     $crop = $this->imageResized; 
     //imagedestroy($this->imageResized); 

     // *** Now crop from center to exact requested size 
     $this->imageResized = imagecreatetruecolor($newWidth , $newHeight); 
     imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight); 
    } 

    ## -------------------------------------------------------- 

    public function saveImage($savePath, $imageQuality="100") 
    { 
     // *** Get extension 
     $extension = strrchr($savePath, '.'); 
      $extension = strtolower($extension); 

     switch($extension) 
     { 
      case '.jpg': 
      case '.jpeg': 
       if (imagetypes() & IMG_JPG) { 
        imagejpeg($this->imageResized, $savePath, $imageQuality); 
       } 
       break; 

      case '.gif': 
       if (imagetypes() & IMG_GIF) { 
        imagegif($this->imageResized, $savePath); 
       } 
       break; 

      case '.png': 
       // *** Scale quality from 0-100 to 0-9 
       $scaleQuality = round(($imageQuality/100) * 9); 

       // *** Invert quality setting as 0 is best, not 9 
       $invertScaleQuality = 9 - $scaleQuality; 

       if (imagetypes() & IMG_PNG) { 
        imagepng($this->imageResized, $savePath, $invertScaleQuality); 
       } 
       break; 

      // ... etc 

      default: 
       // *** No extension - No save. 
       break; 
     } 

     imagedestroy($this->imageResized); 
    } 


    ## -------------------------------------------------------- 

} 

類的偉大工程的文件已經在特定的目錄服務器上。 但是,如果我嘗試使用它正在通過表單上傳這樣的臨時文件:

$counter = count($_FILES['file']['name']); 
if($counter > 0){ 

    for($i=0; $i<$counter; $i++) { 

     $tmpFilePath = $_FILES['file']['tmp_name'][$i]; 

     if($tmpFilePath != ""){ 

      $filePath = $path1.$path2.'/'.$path3.'/'.time().$i.'.jpg'; 

      $resizeObj = new ResizeImage($tmpFilePath); 
      $resizeObj -> processImage(2000, 2000, 'auto'); 
      $resizeObj -> saveImage($filePath, 100); 
     } 
    } 
} 

我得到以下PHP警告:

imagesx() expects parameter 1 to be resource, boolean given in /home/xxxx/xxxx/xxxx/ResizeImage.php on line 25 
imagesy() expects parameter 1 to be resource, boolean given in /home/xxxx/xxxx/xxxx/ResizeImage.php on line 26 
imagecopyresampled() expects parameter 2 to be resource, boolean given in /home/xxxx/xxxx/xxxx/ResizeImage.php on line 68 

任何幫助是極大的讚賞

+0

您可以刪除imagecreate函數之前的@來查看它們失敗的原因 – Musa

+0

相關? https://stackoverflow.com/questions/5770795/php-temporary-file-upload-not-valid-image-resource – deg

+0

@deg是的,它確實幫助了一噸。我剛剛意識到臨時文件沒有擴展名,所以類構造函數正在調用正在測試文件擴展名的openImage()方法。我會解釋我是如何在 – cnapsys

回答

0

檢查後發現@deg發現here

我意識到openImage()方法期待suppl的擴展ied文件。 由於臨時文件沒有擴展名,所以我只是讀取臨時文件內容並從字符串創建圖像。

的openImage()函數現在看起來是這樣的:

private function openImage($file) { 
    $image = file_get_contents($file); 
    $img = imagecreatefromstring($image); 
    $return $img; 
} 

因爲我用的JPEG文件只工作這工作正常我。 我想其他測試可以爲臨時文件類型來完成其餘的測試。