Jump to content

Upload et prévisualisation de fichiers PDF par le client


Recommended Posts

Bonjour

J'ai besoin de permettre à mes clients d'uploader des fichiers pdf et de pouvoir les prévisualiser.
J'utilise pour cela le champ de personnalisation "image" amélioré par ce script:
[CONTRIBUTION] Allow Customers to upload PDF’s

Ça marche super.

Maintenant j'ai besoin d'un petit coup de main pour y intégrer une prévisualisation des fichiers.
Apparemment le plus simple est de faire appel à ImageMagick pour la génération des images à partir du pdf, mais je ne suis pas développeur et j'ai du mal à voir où appeler la fonction.

Voici le code dans le fichier product.php:

function isPDF($file)
{
   /* Detect mime content type */
   $mime_type = false;
   $types = array('application/pdf');

   if (function_exists('finfo_open'))
   {
       $finfo = finfo_open(FILEINFO_MIME);
       $mime_type = finfo_file($finfo, $file['tmp_name']);
       finfo_close($finfo);
   }
   elseif (function_exists('mime_content_type'))
       $mime_type = mime_content_type($file['tmp_name']);
   elseif (function_exists('exec'))
       $mime_type = trim(exec('file -b --mime-type '.escapeshellarg($file['tmp_name'])));
       if (empty($mime_type) || $mime_type == 'regular file')
               $mime_type = $file['type'];
       if (($pos = strpos($mime_type, ';')) !== false)
               $mime_type = substr($mime_type, 0, $pos);
   // is it a picture ?

   return $mime_type && in_array($mime_type, $types);
}

function pictureUpload(Product $product, Cart $cart)
{
   global $errors;

   if (!$fieldIds = $product->getCustomizationFieldIds())
       return false;
   $authorizedFileFields = array();
   foreach ($fieldIds AS $fieldId)
       if ($fieldId['type'] == _CUSTOMIZE_FILE_)
           $authorizedFileFields[intval($fieldId['id_customization_field'])] = 'file'.intval($fieldId['id_customization_field']);
   $indexes = array_flip($authorizedFileFields); 
   foreach ($_FILES AS $fieldName => $file)
       if (in_array($fieldName, $authorizedFileFields) AND isset($file['tmp_name']) AND !empty($file['tmp_name']))
       {
           $fileName = md5(uniqid(rand(), true));
           if (($error = checkImage($file, intval(Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE')))) && (!isPDF($file))) {
               $errors[] = $error;
               return false;
           }
           if (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($file['tmp_name'], $tmpName)) {
               return false;
           }

           if (isPDF($file)) {
                   $fileName = "P" . $fileName;
                   if (!copy($tmpName, _PS_PROD_PIC_DIR_.$fileName)) {
                                $errors[] = Tools::displayError('An error occurred during the image upload.');
                       return false;
                   }
                   $oldfile = './img/pdf.jpg';
           } else {
                   $fileName = "J" . $fileName;
                   if (!imageResize($tmpName, _PS_PROD_PIC_DIR_.$fileName)) {
                                $errors[] = Tools::displayError('An error occurred during the image upload.');
                       return false;
                   }
                   $oldfile = $tmpName;
           }
           if (!imageResize($oldfile,  _PS_PROD_PIC_DIR_.$fileName.'_small', intval(Configuration::get('PS_PRODUCT_PICTURE_WIDTH')), intval(Configuration::get('PS_PRODUCT_PICTURE_HEIGHT')))) {
                        $errors[] = Tools::displayError('An error occurred during the image upload.');
               return false;
           }                    

                       if (!chmod(_PS_PROD_PIC_DIR_.$fileName, 0777) OR !chmod(_PS_PROD_PIC_DIR_.$fileName.'_small', 0777)) {
                               $errors[] = Tools::displayError('An error occurred during the image upload.');
               return false;
           }

           $cart->addPictureToProduct(intval($product->id), $indexes[$fieldName], $fileName);

           unlink($tmpName);
       }
   return true;
} 



Est-ce que quelqu'un peut me donner un petit coup de main ?
Merci :)

Link to comment
Share on other sites

Salut
J'ai la 1.3.5.
Je crois qu'il faut bien régler la taille maxi des fichiers dans "Préférences>Produits>Taille maximum des images produits" (en octets) et dans le fichier config/config.inc.php

@ini_set('upload_max_filesize', '100M');

pour que ça fonctionne.

Link to comment
Share on other sites

oui ça pas de problème... ('upload_max_filesize', '100M');
et sa relation avec le BO reference / outils (100 Mo = 104857600 octets) exactement si ça peu aider

mais si ça a été ok pour toi tu pourrais me dire quel product.php je dois modifier ? - celui de "base" ou celui de l'admin...
quelle lignes exactement à changer ? genre de 9 à 41...

il précise de revenir dans l'admin pour le 2eme code (donc je sous-entend que c'étais là dans l'admin, mais mon Anglais est nul)...
je reste dans le flou... et avec un resultat de page blanche et bug total...


Si tu veux bien développer un petit tuto sur ce qui t'a permis ce résultat, je pense que tu rendra un grand service aux novices comme moi ... merci d'avance

Link to comment
Share on other sites

C'est le product.php de la base qu'il faut modifier.
Je pense que les numéros de lignes changent d'une version à l'autre, chez moi la fonction est de la ligne 8 à 40.
Pour trouver la fonction dans le fichier, fait une recherche dans ton document avec "function pictureUpload".
Le fichier displayImage.php se trouve lui dans l'admin.
Ensuite, le fichier product.tpl c'est celui à la racine du thème.

Je te traduis le post original:

1. Effacez la fonction pictureUpload du fichier product.php (celui qui se trouve à la racine) et remplacez-la avec:

function isPDF($file)
{
   /* Detect mime content type */
   $mime_type = false;
   $types = array('application/pdf');

   if (function_exists('finfo_open'))
   {
       $finfo = finfo_open(FILEINFO_MIME);
       $mime_type = finfo_file($finfo, $file['tmp_name']);
       finfo_close($finfo);
   }
   elseif (function_exists('mime_content_type'))
       $mime_type = mime_content_type($file['tmp_name']);
   elseif (function_exists('exec'))
       $mime_type = trim(exec('file -b --mime-type '.escapeshellarg($file['tmp_name'])));
       if (empty($mime_type) || $mime_type == 'regular file')
               $mime_type = $file['type'];
       if (($pos = strpos($mime_type, ';')) !== false)
               $mime_type = substr($mime_type, 0, $pos);
   // is it a picture ?

   return $mime_type && in_array($mime_type, $types);
}

function pictureUpload(Product $product, Cart $cart)
{
   global $errors;

   if (!$fieldIds = $product->getCustomizationFieldIds())
       return false;
   $authorizedFileFields = array();
   foreach ($fieldIds AS $fieldId)
       if ($fieldId['type'] == _CUSTOMIZE_FILE_)
           $authorizedFileFields[intval($fieldId['id_customization_field'])] = 'file'.intval($fieldId['id_customization_field']);
   $indexes = array_flip($authorizedFileFields); 
   foreach ($_FILES AS $fieldName => $file)
       if (in_array($fieldName, $authorizedFileFields) AND isset($file['tmp_name']) AND !empty($file['tmp_name']))
       {
           $fileName = md5(uniqid(rand(), true));
           if (($error = checkImage($file, intval(Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE')))) && (!isPDF($file))) {
               $errors[] = $error;
               return false;
           }
           if (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($file['tmp_name'], $tmpName)) {
               return false;
           }

           if (isPDF($file)) {
                   $fileName = "P" . $fileName;
                   if (!copy($tmpName, _PS_PROD_PIC_DIR_.$fileName)) {
                                $errors[] = Tools::displayError('An error occurred during the image upload.');
                       return false;
                   }
                   $oldfile = './img/pdf.jpg';
           } else {
                   $fileName = "J" . $fileName;
                   if (!imageResize($tmpName, _PS_PROD_PIC_DIR_.$fileName)) {
                                $errors[] = Tools::displayError('An error occurred during the image upload.');
                       return false;
                   }
                   $oldfile = $tmpName;
           }
           if (!imageResize($oldfile,  _PS_PROD_PIC_DIR_.$fileName.'_small', intval(Configuration::get('PS_PRODUCT_PICTURE_WIDTH')), intval(Configuration::get('PS_PRODUCT_PICTURE_HEIGHT')))) {
                        $errors[] = Tools::displayError('An error occurred during the image upload.');
               return false;
           }                    

                       if (!chmod(_PS_PROD_PIC_DIR_.$fileName, 0777) OR !chmod(_PS_PROD_PIC_DIR_.$fileName.'_small', 0777)) {
                               $errors[] = Tools::displayError('An error occurred during the image upload.');
               return false;
           }

           $cart->addPictureToProduct(intval($product->id), $indexes[$fieldName], $fileName);

           unlink($tmpName);
       }
   return true;
} 

2. Remplacez le contenu du fichier displayImage.php (repertoire admin) avec ça:

<?php

$name = $_GET['name'];
$file = $_GET['img'];

require_once(dirname(__FILE__).'/../config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');

$type = substr($file, 0, 1);
$img = substr($file, 1);

if ($img AND Validate::isMd5($img) AND $name AND Validate::isGenericName($name) AND file_exists(_PS_PROD_PIC_DIR_.$file))
{

   if ($type == "P") {
       header('Content-type: application/pdf');
       $ext = ".pdf";    
   } elseif ($type == "J") {
       header('Content-type: image/jpeg');
       $ext = ".jpg";
   }

   header('Content-Disposition: attachment; filename="'.$name.$ext.'"');
   echo file_get_contents(_PS_PROD_PIC_DIR_.$file);
}

?> 

3. Téléchargez l'image attachée et placez-là dans le repertoire "img" (celui à la racine de la boutique, pas celui du thème)
4. Dans le fichier "product.tpl" du thème, ajoutez "PDF" à la liste des fichiers autorisés

{if $product->uploadable_files}
{l s='Allowed file formats are: GIF, JPG, PNG'}{/if} 



Une fois que tu as créé ton champs de personnalisation "image" pour le produit dans le BO, normalement il peut aussi uploader des pdf.
Je pense qu'on peut adapter ce script pour d'autres type de fichiers (j'ai vu dans les forum des solutions pour uploader des zip par exemple).

*************
Sinon je cherche toujours une solution pour permettre l'affichage d'une miniature du pdf...
si quelqu'un a une idée.....

36377_nUVOJ9wQzK9W4braW25W_t

Link to comment
Share on other sites

  • 1 month later...

pour ta version tu vas dans config / settings.inc.php
il est compatible de la 1.2.5 à la 1.3.6 et peut-être +

la mise en place est très bien expliquée, mais de toute façon le créateur Tomer est hyper sympa et disponible (c'est un modérateur du forum anglais), mais donc qu'en anglais pour le contacter. Tu trouveras un post en français également sur ce module.

si tu rencontre des problèmes, contact moi en MP je te filerais un coup de mains.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...