Jump to content

upload de fichiers via personnalisation


Recommended Posts

Bonjour à tous,

Je cherche à uploader des fichiers de tous types via la personnalisation de produit côté client : tiff, ai, pdf, docx, xls...

J'ai rajouté la ligne

 $types = array('image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/tiff, 'image/x-png','application/pdf');



dans la fonction isPicture du fichier images.inc.php.

Mais rien n'y fait, j'ai toujours un message d'erreur et mon fichier ne s'uploade pas. Quelqu'un aurait-il une idée ?
Je tiens à préciser qu'il ne me faut pas d'upload de zip mais vraiment de ai, psd, eps....

Merci !

Link to comment
Share on other sites

Cassandre,

    if (!$types)
       $types = array('image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png');



Tes modifs ne sont prises en compte que si $types n'est pas spécifié lors de l'appel de fonction :

if (!$types)

.
Dans ce cas il te faudra remplacer l'appel effectué dans le code appelant qui doit être du genre

isPicture($file, $une_liste_de_types)

par

isPicture($file,null)


ou encore par

isPicture($file,$ta_propre_liste_de_types)



C'est sûrement bien le code appelant qu'il faut modifier et non la classe images.inc.php

Link to comment
Share on other sites

Merci pour vos réponses.

J'ai modifié la fonction comme tu m'as conseillé mais cela ne marche pas, ma page product devient blanche....
J'ai modifié la fonction dans images.inc.php, c'est le seul endroit où j'ai trouvé isPicture....

Voici le code,e je ne comprends pas trop... merci

function isPicture($file, NULL)
{
   /* Detect mime content type */
   $mimeType = false;
   if (!$types)
       $types = array('image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png','application/pdf');

   /* Try 4 different methods to determine the mime type */
   if (function_exists('finfo_open'))
   {
       $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
       $finfo = finfo_open($const);
       $mimeType = finfo_file($finfo, $file['tmp_name']);
       finfo_close($finfo);
   }
   elseif (function_exists('mime_content_type'))
       $mimeType = mime_content_type($file['tmp_name']);
   elseif (function_exists('exec'))
   {
       $mimeType = trim(exec('file -b --mime-type '.escapeshellarg($file['tmp_name'])));
       if (!$mimeType)
           $mimeType = trim(exec('file --mime '.escapeshellarg($file['tmp_name'])));
       if (!$mimeType)
           $mimeType = trim(exec('file -bi '.escapeshellarg($file['tmp_name'])));
   }
   if (empty($mimeType) OR $mimeType == 'regular file')
       $mimeType = $file['type'];

   /* For each allowed MIME type, we are looking for it inside the current MIME type */
   foreach ($types AS $type)
       if (strstr($mimeType, $type))
           return true;

   return false;
}

Link to comment
Share on other sites

Visiblement, tu n'as pas modifie le code de la fonction

function isPicture($file, NULL)
{
/* Detect mime content type */
$mimeType = false;
if (!$types)
$types = array('image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png','application/pdf');

C'est la qu'il faut que tu rajoutes tes types mime.
Link to comment
Share on other sites

Ah oui çà serait super gentil ! Le message est soit "fichiers autorisés jpg, gif, png" ou "erreur de transfert".

En fait je pense qu'il faut que je vire le test au niveau du mimetype mais il ne faudrait pas que les gens puissent uploader des fichiers .exe maléfiques !

Je sais que c'est au niveau du type qu'il faut que je fasse quelque chose mais chaque fois çà plante argh !

Link to comment
Share on other sites

Bon a priori (desole c'est un peu vieux cette modif et j'ai pas assez commente visiblement :( ), c'est plutot au niveau du fichier product.php et de la fonction function pictureUpload(Product $product, Cart $cart)

Voila ce que j'ai

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')))) && (!isZIP($file))   && (!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 file upload.');
return false;
}
$oldfile = './img/pdf.jpg';
} 
elseif (isZIP($file)) {
$fileName = "Z" . $fileName;
if (!copy($tmpName, _PS_PROD_PIC_DIR_.$fileName)) {
$errors[] = Tools::displayError('An error occurred during the file upload.');
return false;
}
$oldfile = './img/zip.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;
}


Donc il faut que tu rajoutes tes mime ici

Link to comment
Share on other sites

Voici la fonction telle qu'elle est sans mes modifs :

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'))))
               $errors[] = $error;
           if (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($file['tmp_name'], $tmpName))
               return false;
           elseif (!imageResize($tmpName, _PS_PROD_PIC_DIR_.$fileName))
               $errors[] = Tools::displayError('An error occurred during the image upload.');
           elseif (!imageResize($tmpName, _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.');
           elseif (!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.');
           else
               $cart->addPictureToProduct(intval($product->id), $indexes[$fieldName], $fileName);
           unlink($tmpName);
       }
   return true;
}

Link to comment
Share on other sites

  • 1 month later...

Bonjour,

Ne vaudrait-il pas mieux créer un nouveau type de personnalisation plutôt que modifier l'existant, ce serait peut être plus simple (avec un module par exemple, comme ça le marchand pourrait même choisir quel(s) type(s) de fichiers), non ? Par contre coté sécurité il faudra faire attention!

Ah, et en relisant le fil, je vois que pour les cas pdf xls, doc ça ne marchera pas car ce ne sont pas des images, et la fonction teste la taille des images (et donc la dimension (longueurXlargeur) d'un fichier .doc c'est difficile :P).

Un risque plus important que le maléfique .exe, ce serait un fichier avec du code php ! Donc il faut vraiment être très attentif (par exemple interdire que les fichiers envoyés soit lus ou exécutés (une image c'est pas grave mais un script ... ) ... Le mieux serait d'ailleurs que le dossier d'upload ne soit pas accessible du web, c'est à dire avant la racine.

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...