2010-12-01 5 views
3

J'ai passé des jours à essayer de faire ce travail sur la base des exemples dans la documentation, mais je manque quelque chose ou je suis tout simplement stupide!CodeIgniter Upload et Redimensionner Problème

J'ai une application CMS où les utilisateurs téléchargent une image pour l'affichage dans une mise en page très fixe. Nous ne voulons pas limiter la taille du fichier de l'image téléchargée mais plutôt la "traiter" après son arrivée.

L'image doit être 615px de large, mais quelques-unes des images téléchargées directement à partir des appareils photo numériques sont 2500X2000 et plus cela est si important.

Je Rassemblé le code du manuel et l'image est en cours de téléchargement avec succès à un dossier dans l'application CMS. Toutefois, l'image n'est pas en cours de redimensionnement. Si jamais je l'obtiens à redimensionner, mon plan est de présenter l'image à l'utilisateur pour recadrer en utilisant jCrop (l'image finale doit être 615X275 et il doit probablement être recadrée pour la taille après le redimensionnement), puis Utilisez codeigniter pour FTP l'image vers le dossier des commodités de leur site en utilisant le nom d'origine.

J'apprécie toute aide à ce sujet!

Voici mon code:

 
function do_feature_upload() { 
     $imageName = $this->uri->segment(3); 
     //echo $imageName; 

     // Where the file is going to be placed 
     $config['upload_path'] = "./uploads/".$_SESSION['dbPropNumber']; 
     $config['allowed_types'] = 'jpg|jpeg'; 
     $config['max_size'] = '0'; 
     $config['file_name'] = $imageName.'.jpg'; 
     $config['overwrite'] = 'TRUE'; 

     $this->load->library('upload', $config); 

     if (! $this->upload->do_upload()) { 
      $error = array('error' => $this->upload->display_errors()); 

      $error['propertyDropdown'] = $_SESSION['propertyDropdown']; 
      $error['username'] = $_SESSION['username']; 
      $error['dbPropNumber'] = $_SESSION['dbPropNumber']; 
      $error['propertyName'] = $this->content->getPropertyName($_SESSION['dbPropNumber']); 

      $this->load->view('upload_AmenityImage', $error); 
     } else { 
      $image_data = $this->upload->data(); 

      $origWidth = $image_data['image_width']; 
      $origHeight = $image_data['image_height']; 
      $newWidth = 615; 
      $newHeight = $newWidth*$origHeight/$origWidth; 

      $resize = array(
       'image_library'=>'gd2', 
       'source_image'=>base_url().'uploads/'.$_SESSION['dbPropNumber'].'/'.$imageName.'.jpg', 
       'new_image'=>base_url().'uploads/'.$_SESSION['dbPropNumber'].'/'.$imageName.'1.jpg', 
       'create_thumb' => FALSE, 
       'maintain_ratio'=>FALSE, 
       'width'=>$newWidth, 
       'height'=>$newHeight 
      ); 

      $this->load->library('image_lib',$resize); 
      $this->image_lib->resize(); 

      $data = array('upload_data' => $this->upload->data()); 
      $data['propertyDropdown'] = $_SESSION['propertyDropdown']; 
      $data['username'] = $_SESSION['username']; 
      $data['dbPropNumber'] = $_SESSION['dbPropNumber']; 
      $data['propertyName'] = $this->content->getPropertyName($_SESSION['dbPropNumber']); 

      //Present jCrop option after image is resized 

      // FTP to final destination 

      $this->load->view('upload_success', $data); 
     } // end if 
    } // end function 
+0

essayez de supprimer base_url() dans la fonction de redimensionnement.Si j'ai des chemins corrects (image_source et nouvelle_image) doivent être relative pas absolue. – trix

+0

TRAVAILLÉ COMME UN CHARME! !!! MERCI !!! – jgravois

Répondre

6

Je ne suis pas tout à fait sûr de ce qui se passe mal avec votre code, mais voici une fonction de modèle que j'ai écrit pour le redimensionnement des images pour s'adapter à une hauteur cible exacte et largeur cible. Lisez-le et voyez si vous ne pouvez pas comprendre la solution.

$this->prefix est une propriété dans ma classe que j'utiliser donc je ne dois pas continuer à écrire le répertoire du fichier. Il ressemble à ceci:

$this->prefix = FCPATH.'uploads'.DIRECTORY_SEPARATOR;

Image resizer

/** 
* Resizes an image to fit exact dimensions 
* 
* @param string filename 
* @param int  target_width 
* @param int  target_height 
* 
* @return array('success' ? null : 'error') 
*/ 
function resizeImageToDimensions($filename, $target_width=700, $target_height=399) 
{ 
    $file_type = $this->getFileType($this->prefix.$filename); 

    if (!$file_type || $file_type != 'image') 
     return array('success'=>false, 'error'=>"This file doesn't exist or isn't an image"); 

    $this->load->library('image_lib'); 

    list($width, $height) = getimagesize($this->prefix.$filename); 
    $current_ratio = $width/$height; 
    $target_ratio = $target_width/$target_height; 
    $config['source_image'] = $this->prefix.$filename; 

    if ($current_ratio > $target_ratio) 
    { 
     //resize first to height, maintain ratio 
     $config['height'] = $target_height; 
     $config['width'] = $target_height * $current_ratio; 
     $this->image_lib->initialize($config); 

     if (!$this->image_lib->resize()) 
      return array('success'=>false, 'error'=>"There was an error while resizing this image"); 

     //then crop off width 
     $config['width'] = $target_width; 
     $config['maintain_ratio'] = false; 
     $this->image_lib->initialize($config); 

     if ($this->image_lib->crop()) 
      return array('success'=>true); 
     else 
      return array('success'=>false, 'error'=>"There was an error while cropping this image"); 
    } 
    else if ($current_ratio < $target_ratio) 
    { 
     //resize first to width, maintain ratio 
     $config['width'] = $target_width; 
     $config['height'] = $target_width/$current_ratio; 
     $this->image_lib->initialize($config); 

     if (!$this->image_lib->resize()) 
      return array('success'=>false, 'error'=>"There was an error while resizing this image"); 

     //then crop off height 
     $config['height'] = $target_height; 
     $config['maintain_ratio'] = false; 
     $this->image_lib->initialize($config); 

     if ($this->image_lib->crop()) 
      return array('success'=>true); 
     else 
      return array('success'=>false, 'error'=>"There was an error while cropping this image"); 
    } 
    else { 
     $config['width'] = $target_width; 
     $config['height'] = $target_height; 
     $this->image_lib->initialize($config); 

     if ($this->image_lib->resize()) 
      return array('success'=>true); 
     else 
      return array('success'=>false, 'error'=>"There was an error while resizing this image"); 
    } 
} 
+0

donc je devrais mettre cela dans le modèle et l'appeler comme ceci: $ this-> content-> resizeImageToDimensions ($ image_data ['$ image_data [' full_path '],'], $ newWidth, $ newHeight); – jgravois

+0

Quelque chose comme cela, sauf être sûr que le chemin de l'image est pointé au bon endroit (il pourrait falloir un peu de bricolage pour le faire fonctionner correctement). Ce n'est pas vraiment nécessaire de garder cela dans un modèle, mais c'est la façon dont j'aime organiser les choses (je prends généralement une approche holistique de MVC ... tout ce qui concerne le stockage/manipulation de données/données va dans le modèle). Il n'y a pas de raison pour que cela ne soit pas simplement sa propre bibliothèque ou une extension sur image_lib. Tout ce qui fonctionne le mieux pour vous. Mais oui, le mieux est de garder cela hors du contrôleur car dans tous les cas, vous devriez avoir des contrôleurs minces. – treeface

1

J'ai eu le même problème il y a quelques mois et, malheureusement, je ne pouvais pas le comprendre. J'ai posté la même question here et CodeIgniter's forums mais personne ne pouvait m'aider.

Je fini en utilisant un script timthumb, qui est grande, mais loin d'être idéal :(

Donc, si vous êtes pressé, je vous recommande fortement d'utiliser timthumb. Si vous avez du temps d'investir dessus, je vous souhaite le meilleur et s'il vous plaît, partagez!