Jump to content

[Resolu] Permettre aux clients l'upload de son (mp3, wma..)


Recommended Posts

Bonjour à tous !

 

Je suis un tout nouvel utilisateur de prestashop. Mes connaissances en langages informatiques sont limités; aussi je ne maitrise pas encore bien le php.

 

Cependant, j'aimerais permettre aux d'uploader des fichiers de sons ( type mp3, wma etc...) pour personnaliser leurs produits. Cette personalisation sera possible grace au champ permettant deja de télécharger une image ( à partir de la fiche produit).

 

Pour cela, j'ai arpenté le forum, et je suis tombé sur un tuto qui permet d'uploader en plus des fichiers images des fichiers de type pdf et zip. Le lien de ce tuto : http://www.prestasho...599#entry718599

 

J'ai donc suivi à la lettre ce tuto, en remplacant mes fichiers "ProductControler.php", images.inc.php", "displayImage.php" et "AdminOrders.php" par ceux proposés. Ne voulant pas permettre aux clients l'envoi de zip mais de mp3, j'ai alors changé tous les "zip" par "mp3" et "ZIP" par "MP3". Probleme : cela ne fonctionne pas, j'ai cette erreur qui apparait quand je tente de télécharger un fichier mp3 : 01. format de l'image non reconnu ; formats acceptés ...

 

Qu'ai je mal fait? Est ce que quelqu'un comprend et pourrais m'expliquer ce qui ne fonctionne pas?

 

Je vous en remercie par avance

 

Cordialement.

 

Edit : n'hésitez pas a demander une contrepartie de ma part si vous jugez cela necessaire! Je serai aussi généreux que mon statut d'étudiant me le permet ;)

Edited by dindonroyal (see edit history)
Link to comment
Share on other sites

Bonjour à tous !

 

Je suis un tout nouvel utilisateur de prestashop. Mes connaissances en langages informatiques sont limités; aussi je ne maitrise pas encore bien le php.

 

Cependant, j'aimerais permettre aux d'uploader des fichiers de sons ( type mp3, wma etc...) pour personnaliser leurs produits. Cette personalisation sera possible grace au champ permettant deja de télécharger une image ( à partir de la fiche produit).

 

Pour cela, j'ai arpenté le forum, et je suis tombé sur un tuto qui permet d'uploader en plus des fichiers images des fichiers de type pdf et zip. Le lien de ce tuto : http://www.prestasho...599#entry718599

 

J'ai donc suivi à la lettre ce tuto, en remplacant mes fichiers "ProductControler.php", images.inc.php", "displayImage.php" et "AdminOrders.php" par ceux proposés. Ne voulant pas permettre aux clients l'envoi de zip mais de mp3, j'ai alors changé tous les "zip" par "mp3" et "ZIP" par "MP3". Probleme : cela ne fonctionne pas, j'ai cette erreur qui apparait quand je tente de télécharger un fichier mp3 : 01. format de l'image non reconnu ; formats acceptés ...

 

Qu'ai je mal fait? Est ce que quelqu'un comprend et pourrais m'expliquer ce qui ne fonctionne pas?

 

Je vous en remercie par avance

 

Cordialement.

 

Edit : n'hésitez pas a demander une contrepartie de ma part si vous jugez cela necessaire! Je serai aussi généreux que mon statut d'étudiant me le permet ;)

 

Le hic dans ton cas est que si prestashop est conçu pour l'upload d'images , il ne l'est pas pour d'autres formats ...

Il va te falloir regarder ce qui se passe dans le postprocess justement et tracer le code...

Je trouve assez curieux, puisque tu es étudiant, que l'on te demande de gérer ce genre de projet ( un devoir ????) si effectivement tu n'as que peu de connaissance en php , donc j'ose pas imaginer dans un contexte environnemental plutot orienté objet comme prestashop ?

Je fais un deal : tu nous expliques, et on t'en dis plus , c'est fair non ?

Link to comment
Share on other sites

Broceliande : Je suis étudiant, mais ce projet n'est pas lié à mes études. Je souhaite lancer un site d'e-commerce en parallèle de mes étude, tout simplement. Pour ce qui concerne le fait que prestashop soit prévu pour l'upload d'image, le tutorial que j'ai présenté dans mon premier message fonctionne ( ce qui répond également à jeckyl ). Par conséquent, j'arrive bien à uploader des pdf et des zip. C'est pour cela que je ne comprends pas pourquoi je n'arrive pas avec d'autres extensions!

 

Dans tous les cas, merci de ces réponses rapides. Il s'agit la de mon premier topic, et je suis agréablement surpris de la rapidité de la communauté !

Link to comment
Share on other sites

Merci pour ta réponse, on aime bien savoir à qui on parle , enfin ça là ça n'engage que moi ;)

 

L'approche que tu as est d'utiliser l'existant , ce qui est louable, et sans connaitre les tutos que tu as suivi, je ne peux que déduire qu' il y est forcément question de modification du core... mais bon ...

Je vais rejoindre jeckyl sur ce point : si tu parviens à joindre des pdf ou zip à tes fiches produits, côté BO, cela n'a pas de sens que tu rencontres des pbs avec d'autre extensions.

Es tu bien certain d'avoir traîté tous les scripts altérés par ces modifs ?

Idéalement , tu nous posterais tes scripts modifiés ... ça devrait nous parler, et peut être que ces scripts peuvent ou doivent être transformés en surchage, afin de pas figer le site dans une version donnée et assurer les maj à venir.

Link to comment
Share on other sites

Alors, je vais vous présenter les modification que j'ai faites. Je parts de la version permettant de télécharger des zip et pdf (qui fonctionne), et je vous présente les modification à partir de cette version la.

 

Alors, on commence par le fichier ProductController.php :

 

public function displayContent()
{
 parent::displayContent();
 self::$smarty->display(_PS_THEME_DIR_.'product.tpl');
}

public function isPDF($file)
{
 $name = $file['name'];
 $ext = strrchr($name, '.');
 //echo '<br />pdf-DEBUG file===><pre>'.print_r($file);echo '</pre><br />DEBUG mimetpye===>'.$ext;

  if($ext == '.pdf'){
  $isPDF = true;
 }else{
  $isPDF = false;
 }
 return $isPDF;
}

public function isMP3($file)
{
 /* Detect mime content type */
 $name = $file['name'];
 $ext = strrchr($name, '.');
 //echo '<br />mp3-DEBUG file===><pre>'.print_r($file);echo '</pre><br />DEBUG mimetpye===>'.$ext;

 if($ext == '.mp3'){
  $isMP3 = true;
 }else{
  $isMP3 = false;
 }
 return $isMP3;
}

public function isAI($file){
 /* Detect mime content type */
 $name = $file['name'];
 $ext = strrchr($name, '.');
 //echo '<br />ai-DEBUG file===><pre>'.print_r($file);echo '</pre><br />DEBUG mimetpye===>'.$ext;

 if($ext == '.ai'){
  $isAI = true;
 }else{
  $isAI = false;
 }
 return $isAI;

}

public function isPSD($file){
 /* Detect mime content type */
 $name = $file['name'];
 $ext = strrchr($name, '.');
 //echo '<br />psd-DEBUG file===><pre>'.print_r($file);echo '</pre><br />DEBUG mimetpye===>'.$ext;

 if($ext == '.psd'){
  $isPSD = true;
 }else{
  $isPSD = false;
 }
 return $isPSD;

}

public function pictureUpload(Product $product, Cart $cart)
{
 if (!$fieldIds = $this->product->getCustomizationFieldIds())
  return false;
 $authorizedFileFields = array();
 foreach ($fieldIds AS $fieldId)
  if ($fieldId['type'] == _CUSTOMIZE_FILE_)
$authorizedFileFields[(int)($fieldId['id_customization_field'])] = 'file'.(int)($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, (int)(Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'))))
 $this->errors[] = $error;
if ($error OR (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($file['tmp_name'], $tmpName)))
 return false;
/*//Original file
elseif (!imageResize($tmpName, _PS_UPLOAD_DIR_.$fileName))
 $this->errors[] = Tools::displayError('An error occurred during the image upload.');
// A smaller one
elseif (!imageResize($tmpName, _PS_UPLOAD_DIR_.$fileName.'_small', (int)(Configuration::get('PS_PRODUCT_PICTURE_WIDTH')), (int)(Configuration::get('PS_PRODUCT_PICTURE_HEIGHT'))))
 $this->errors[] = Tools::displayError('An error occurred during the image upload.');
elseif (!chmod(_PS_UPLOAD_DIR_.$fileName, 0777) OR !chmod(_PS_UPLOAD_DIR_.$fileName.'_small', 0777))
 $this->errors[] = Tools::displayError('An error occurred during the image upload.');
else
 $cart->addPictureToProduct((int)($this->product->id), $indexes[$fieldName], $fileName);
unlink($tmpName);*/

if ($this->isMP3($file)) {
  $fileName = "Z" . $fileName;
  if (!rename($tmpName, _PS_UPLOAD_DIR_.$fileName)) {
	  $errors[] = Tools::displayError('An error occurred during the file upload.');
   return false;
  }
  //echo 'nom temporaire===>'.$tmpName;
  $oldfile = _PS_IMG_DIR_.'mp3.jpg';
}
elseif ($this->isAI($file)) {
  $fileName = "A" . $fileName;
  if (!rename($tmpName, _PS_UPLOAD_DIR_.$fileName)) {
	  $errors[] = Tools::displayError('An error occurred during the file upload.');
   return false;
  }
  //echo 'nom temporaire===>'.$tmpName;
  $oldfile = _PS_IMG_DIR_.'ai.jpg';
}
elseif ($this->isPSD($file)) {
  $fileName = "S" . $fileName;
  if (!rename($tmpName, _PS_UPLOAD_DIR_.$fileName)) {
	  $errors[] = Tools::displayError('An error occurred during the file upload.');
   return false;
  }
  //echo 'nom temporaire===>'.$tmpName;
  $oldfile = _PS_IMG_DIR_.'psd.jpg';
}
elseif ($this->isPDF($file)) {
  $fileName = "P" . $fileName;
  if (!rename($tmpName, _PS_UPLOAD_DIR_.$fileName)) {
	  $errors[] = Tools::displayError('An error occurred during the image upload.');
   return false;
  }
  //echo 'nom temporaire===>'.$tmpName;
  $oldfile = _PS_IMG_DIR_.'pdf.jpg';
}
else {
  $fileName = "J" . $fileName;
  if (!imageResize($tmpName, _PS_UPLOAD_DIR_.$fileName)) {
	  $errors[] = Tools::displayError('An error occurred during the image upload.');
   return false;
  }
  $oldfile = $tmpName;
}
//echo 'old file===>'.$oldfile.'<br />upload===>'._PS_UPLOAD_DIR_.$fileName.'<br />';
if (!imageResize($oldfile,  _PS_UPLOAD_DIR_.$fileName.'_small', intval(Configuration::get('PS_PRODUCT_PICTURE_WIDTH')), intval(Configuration::get('PS_PRODUCT_PICTURE_HEIGHT')))) {
 //echo 'Je suis passé par la !!! HAHAHA !!!';
	$errors[] = Tools::displayError('An error occurred during the image upload.');
 return false;
}


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

$cart->addPictureToProduct(intval($product->id), $indexes[$fieldName], $fileName);
unset($oldfile);
unlink($tmpName);
  }
 return true;
}

 

Dans cette portion, j'ai remplacé tous les "zip" par "mp3" et "ZIP" par "MP3".

 

 

Voici comment j'ai modifier images.inc.php :

 


function isPicture($file, $types = 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',
	'application/acrobat',
	'application/nappdf',
	'application/x-pdf',
	'application/vnd.pdf',
	'text/pdf',
	'text/x-pdf',
	'multipart/x-mp3',
	'application/mp3',
	'application/x-mp3-compressed',
	'application/x-mp3',
	'application/illustrator',
	'application/photoshop',
	'application/psd',
	'application/x-photoshop',
	'image/photoshop',
	'image/psd',
	'image/x-photoshop',
	'image/x-psd',
	'image/vnd.adobe.photoshop',
	'application/octet-stream');
/* 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' OR $mimeType == 'text/plain')
	$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;
}

 

La encore, j'ai remplacé les zip par mp3.

 

 

Pour le displayImage.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 (isset($img) AND Validate::isMd5($img) AND isset($name) AND Validate::isGenericName($name) AND file_exists(_PS_UPLOAD_DIR_.$file))
{
if ($type == "P") {
	header('Content-type: application/pdf');
	$ext = ".pdf";  
} elseif ($type == "A") {
	header('Content-type: application/illustrator');
	$ext = ".ai";
}elseif ($type == "Z") {
	header('Content-type: application/mp3');
	$ext = ".mp3";
}elseif ($type == "S") {
	header('Content-type: application/photoshop');
	$ext = ".psd";
}elseif ($type == "J") {
	header('Content-type: image/jpeg');
	$ext = ".jpg";
}

header('Content-Disposition: attachment; filename="'.$name.$ext.'"');
echo file_get_contents(_PS_UPLOAD_DIR_.$file);
}else{
$file_exists = 0;
$isMd5 = 0;
$isGenericName = 0;
if(file_exists(_PS_UPLOAD_DIR_.$file)){
 $file_exists = 1;
}
if(Validate::isMd5($img)){
 $isMd5 = 1;
}
if(Validate::isGenericName($name)){
 $isGenericName = 1;
}
echo 'POBLEME !!!<br />img:'.$img.' name : '.$name.'file_exists : '.$file_exists.'isMd5 : '.$isMd5.'isGenericName : '.$isGenericName;
}

 

Par contre, j'ai rien changé dans AdminOrders.php, je ne crois pas que c'était nécessaire...

 

 

Donc, quand je télécharge un fichier .mp3, j'ai l'erreur suivante qui apparait :

  1. Image format not recognized, allowed formats are: .gif, .jpg, .png, .pdf, .psd, .ai, .mp3

 

 

Voila, je serai vraiment content de comprendre ce qui ne fonctionne pas. Désolé de la longueur de ce post, je sais pas s ic'est le plus judicieux de copier/coller le code dans le message .. ^^

Edited by dindonroyal (see edit history)
Link to comment
Share on other sites

Je viens de me rendre compte que les MIME type pour les mp3 ne sont pas ceux que j'ai mis.

 

J'ai donc rajouté dans images.inc.php :

'audio/mpeg',

'audio/mpeg3',

'audio/x-mpeg-3',

'video/mpeg',

'video/x-mpeg',

 

ici :

function isPicture($file, $types = 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',
	'application/acrobat',
	'application/nappdf',
	'application/x-pdf',
	'application/vnd.pdf',
	'text/pdf',
	'text/x-pdf',
	'multipart/x-mp3',
	'application/mp3',
	'application/x-mp3-compressed',
	'application/x-mp3',
  'audio/mpeg3',
  'audio/mpeg',
  'audio/x-mpeg-3',
  'video/mpeg',
  'video/x-mpeg',
	'application/illustrator',
	'application/photoshop',
	'application/psd',
	'application/x-photoshop',
	'image/photoshop',
	'image/psd',
	'image/x-photoshop',
	'image/x-psd',
	'image/vnd.adobe.photoshop',
	'application/octet-stream');

 

Et... ca fonctionne !!!

 

Avis à ceux à qui ça pourrait servir ^^ !

Edited by dindonroyal (see edit history)
Link to comment
Share on other sites

Hello dindonroyal (lol...j'ai hésité) .

Cool que tu y sois parvenu , mais à mon sens , la méthode est génante.

D'une part ce sont des modification en dure dans le core : adios les maj ....

D'autre part , ça n'est pas très formateur à mon sens , si l'on fait abstraction du côté fonctionnel, ni très sécure au final ...

Etant donné que l'upload se fait avant commande , n'importe quel gamin en mal de sensations peut t' innonder de fichiers en toute impunité.

A mon sens , hormis si c'est absolument indispensable que la personnalisation intervienne avant la commande, il est préférable de gérer les envois en post commande.

Je te propose de jeter un oeil sur ce module :

http://www.presta-broceliande.fr/fr/16-mes-uploads.html

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