2017-09-03 4 views
1

Je rencontre quelques problèmes lorsque j'essaie de redimensionner les fichiers temporaires en cours de téléchargement.redimensionner plusieurs images sur le téléchargement ne fonctionne pas

J'utilise la classe ResizeImage.php suivante:

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); 
    } 


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

} 

La classe fonctionne très bien pour les fichiers déjà sur le serveur dans un répertoire spécifique. Toutefois, si je tente de l'utiliser pour les fichiers temporaires qui sont en cours de téléchargement par une forme comme ceci:

$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); 
     } 
    } 
} 

que je reçois les avertissements PHP suivants:

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 

Toute aide est grandement appréciée

+0

Vous pouvez supprimer le @ avant les fonctions imagecreate pour voir pourquoi elles échouent – Musa

+0

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

+0

@deg oui ça m'a beaucoup aidé. Je viens de réaliser que les fichiers temporaires n'ont pas d'extension donc le constructeur de la classe appelait la méthode openImage() qui testait une extension du fichier. Je vais vous expliquer comment je l'ai réparé ci-dessous – cnapsys

Répondre

0

Après avoir vérifié le post @deg trouvé here

Je me suis rendu compte que la méthode openImage() attendait une extension pour le suppl fichier (s). Comme les fichiers temporaires n'ont pas d'extension, une astuce rapide et sale pour moi consistait simplement à lire le contenu du fichier temporaire et à créer l'image à partir d'une chaîne.

la fonction ressemble maintenant à ce OpenImage():

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

depuis que je travaille uniquement avec des fichiers jpeg cela fonctionne ok pour moi. Je suppose que des tests supplémentaires pourraient être effectués pour les types de fichiers temporaires pour couvrir le reste.