Précédent   Forum des professionnels en informatique > PHP > Scripts
Scripts Forum d'entraide sur les scripts PHP téléchargés. Les meilleurs scripts PHP, la FAQ scripts PHP, toutes les FAQ PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/08/2006, 12h31   #1
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
Par défaut [PHP4][Base64] décoder un fichier mp3

Bonjour, j'ai un petit soucis en téléchargeant un son via un webservice, celui ci me retourne une chaine de caractère encodé en Base64, je n'arrive pas à obtenir mon fichier mp3.
Pouvez vous m'apporter un peu d'explication la dessus, merci par avance
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 12h34   #2
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
http://www.fourmilab.ch/webtools/base64/

Suffit juste de decoder le fichier
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 12h47   #3
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
j'ai rien compris a ton truc, par contre, j'ai fait un truc comme ça mais ça ne marche pas :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
dl_file(base64_decode($result));
 
function dl_file($file){
 
   //First, see if the file exists
   if (!is_file($file)) { die("<b>404 File not found!</b>"); }
 
   //Gather relevent info about file
   $len = filesize($file);
   $filename = basename($file);
   $file_extension = strtolower(substr(strrchr($filename,"."),1));
 
   //This will set the Content-Type to the appropriate setting for the file
   switch( $file_extension ) {
         case "pdf": $ctype="application/pdf"; break;
     case "exe": $ctype="application/octet-stream"; break;
     case "zip": $ctype="application/zip"; break;
     case "doc": $ctype="application/msword"; break;
     case "xls": $ctype="application/vnd.ms-excel"; break;
     case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
     case "gif": $ctype="image/gif"; break;
     case "png": $ctype="image/png"; break;
     case "jpeg":
     case "jpg": $ctype="image/jpg"; break;
     case "mp3": $ctype="audio/mpeg"; break;
     case "wav": $ctype="audio/x-wav"; break;
     case "mpeg":
     case "mpg":
     case "mpe": $ctype="video/mpeg"; break;
     case "mov": $ctype="video/quicktime"; break;
     case "avi": $ctype="video/x-msvideo"; break;
 
     //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
     case "php":
     case "htm":
     case "html":
     case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;
 
     default: $ctype="application/force-download";
   }
 
   //Begin writing headers
   header("Pragma: public");
   header("Expires: 0");
   header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
   header("Cache-Control: public"); 
   header("Content-Description: File Transfer");
 
   //Use the switch-generated Content-Type
   header("Content-Type: $ctype");
 
   //Force the download
   $header="Content-Disposition: attachment; filename=".$filename.";";
   header($header );
   header("Content-Transfer-Encoding: binary");
   header("Content-Length: ".$len);
   @readfile($file);
   exit;
}
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 12h57   #4
Expert Confirmé
 
Avatar de KiLVaiDeN
 
Inscription : octobre 2003
Messages : 2 714
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 714
Points : 2 689
Points : 2 689
Salut,

Regarde la fonction base64_decode
__________________
K
KiLVaiDeN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 13h51   #5
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
Merci mais c'est la premiere chose que j'ai faite et qui me renvoie une chaine de caractère, je souhaite forcer le telechargement d'un fichier mp3 à un utilisateur.
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h03   #6
Expert Confirmé
 
Avatar de KiLVaiDeN
 
Inscription : octobre 2003
Messages : 2 714
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 714
Points : 2 689
Points : 2 689
Il faut alors mettre les headers HTTP qui vont bien.

Code :
Content-transfer-encoding: base64
__________________
K
KiLVaiDeN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h10   #7
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
Tout bêtement, j'ai essayé ça :
Code :
print "Content-transfer-encoding: base64".base64_decode($result);
mais je dois mal m'y prendre, pourriez vous me donner un peu plus d'élements ? merci bien
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h13   #8
Expert Confirmé
 
Avatar de KiLVaiDeN
 
Inscription : octobre 2003
Messages : 2 714
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 714
Points : 2 689
Points : 2 689
Il faut utiliser la fonction "header()" de PHP, pour préciser les headers.

Un header, dans le protocole HTTP, est un entête de description de contenu. Il est lu en premier par le navigateur, avant le contenu de la page lui même, et ceci afin de pouvoir interpreter le contenu convenablement.

Donc en précisant dans le header que tu as un contenu en base64, tu n'as même pas besoin de le décoder au préalable : c'est le navigateur qui s'en occupera.

Il faut également préciser le header Content-Type, en fichier mp3. Cherche la liste des Content-Type disponible, et tu trouveras celui correspondant au fichier MP3.
__________________
K
KiLVaiDeN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h01   #9
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
j'ai tourné le truc dans tous les sens, voici ou je bloque
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
require_once("lib/xmlrpc.inc");
 
header("Content-Type: ctype=\"audio/mpeg\"");
header("Content-Transfer-Encoding: base64");
session_start();
$server = new xmlrpc_client(SERVER_URL);
$method = 'MP3.GetFile';
$values = array(
	new xmlrpcval(1,'int'),
	new xmlrpcval($_SESSION['SSID'],'string'),
);
$message=new xmlrpcmsg($method,$values);
$result = $server->send($message);
$value =$result->value();
$a = php_xmlrpc_decode($value);
print $a;
Ce code me balance le telechargement de mon fichier index.php courant et n'est pas lisible en mp3

si je commente la ligne
Code :
header("Content-Type: ctype=\"audio/mpeg\"");
j'ai une page qui resemble à
Citation:
UklGRiRLAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YQBLAAAAfgB+AIIAggB+AH4AggCCAH4AfgCCAIIAfgB+AIIAggB+
si j'enlève ou non le
Code :
header("Content-Transfer-Encoding: base64");
la chaine ne change pas.
Ai je fais une erreur ?
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h16   #10
Expert Confirmé
 
Avatar de KiLVaiDeN
 
Inscription : octobre 2003
Messages : 2 714
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 714
Points : 2 689
Points : 2 689
Pourquoi cette ligne ?

Code :
header("Content-Type: ctype=\"audio/mpeg\"");
Essaie plutot avec :

Code :
header('Content-Type: audio/mpeg');
PS : je préfère les simples quotes quand il n'y a pas de variable php à interpreter dans la chaine
__________________
K
KiLVaiDeN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h19   #11
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
la j'ai quicktime qui se lance mais qui n'arrive pas a lire le flux, je sais pas d'ou viens le problème, si j'encode ou décode, ça reste pareil.
Merci en tout cas pour l'aide que tu m'a déja fournie, j'ai pas mal evolué
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h28   #12
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Si tu veux forcer le navigateur à télécharger le fichier, il y a un header pour cela (force-download ou pas loin). Attention, il me semble qu'Internet Explorer le gère mal.

Si je reprends l'intérêt de ton script, il télécharge un mp3 d'un autre site, le décode (car le fichier de départ est encodé en base64) et l'envoie au navigateur. J'ai bon ?
Si c'est bien cela, alors il ne faut pas préciser le header base64, puisque ton script a décodé le fichier entre temps. Envoie simplement le header de content-type et celui de attached-file.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h34   #13
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
hello yogui;
si je met ou non
Code :
header("Content-Transfer-Encoding: base64")
de toute facon, le fichier contient la meme chose.

Je ne veux pas spécialement forcer le téléchargement, j'aimerais déja que mon mp3 soit valide or, se n'est pas le cas.

Pour résumé, j'ai un webservice qui me retourne un son codé en Base64, si j'affiche ce flux, j'ai une chaine bien pourrie, par contre si je met le header pour le mp3, cette chaine est ouverte avec quicktime mais il se fautre le pauvre.
J'ai essayé de faire un rien n'y change.
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h37   #14
Expert Confirmé
 
Avatar de KiLVaiDeN
 
Inscription : octobre 2003
Messages : 2 714
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 714
Points : 2 689
Points : 2 689
As-tu le mp3 original ?

Si oui, met un force-download, télécharge le mp3 généré, et compare en hexadecimal les contenus; si ils sont identiques, c'est ton navigateur ( et quicktime en l'occurence ) qui est à la ramasse !

Normalement, quand tu fournis le bon type et le contenu du fichier, tout devrait bien se passer..

Question : comment sais-tu que ton fichier est en base64 ?
__________________
K
KiLVaiDeN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h50   #15
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
J'ai encodé un mp3 (qui fonctionne) avec ce script :
Code :
1
2
3
4
5
6
7
8
<?php
 
define('DECODED_MP3', 'test.mp3');
define('ENCODED_MP3', 'encoded.mp3');
 
file_put_contents(ENCODED_MP3, base64_encode(file_get_contents(DECODED_MP3)));
 
?>
Puis j'ai testé cet autre script :
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
 
define('ENCODED_MP3', 'encoded.mp3');
 
header('Content-Type: audio/mpeg');
header('Content-type: application/force-download');
header('Content-disposition: attachment; filename='.ENCODED_MP3);
 
echo base64_decode(file_get_contents(ENCODED_MP3));
 
?>
Devine quoi : ça fonctionne !
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 17h05   #16
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
Alrs, pour le mp3, je n'ai pas l'original, c'est un webservice qui m'envoie les messages d'un répondeur.
Pour la base64, c'est parce que c'est écrit dans la doc et que l'objet recu avec un var_dump j'ai ['base64'] = zfedoh54864fdg864sd3r54g3d5qgf...


je regarde un peu tout ça, désolé, j'étais en réunion
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 17h18   #17
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
je vous joins la reponse brut de mon webservice

j'ai aussi trouvé ça dans la doc
Citation:
Base 64 encoding is performed transparently to the caller when using this type. Therefore you ought to consider it as a "binary" data type, for use when you want to pass none 7-bit clean data. Decoding is also transparent.
Fichiers attachés
Type de fichier : txt reponse.txt (26,0 Ko, 5 affichages)
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 17h40   #18
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Ya pas moyen que tu nous files directement les infos du webservice ? Je n'arrive à rien avec ton truc.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 17h41   #19
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
euh non je ne peux pas, il n'est pas accessible en réseau.
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 17h43   #20
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Mouahaha, la chaîne qu'ils te donnent (entre les deux guillemets) fait 25.659 caractères au lieu des 25.660 annoncés.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h13.


 
 
 
 
Partenaires

Hébergement Web