IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[PHP4][Base64] décoder un fichier mp3


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    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

  2. #2
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    http://www.fourmilab.ch/webtools/base64/

    Suffit juste de decoder le fichier

  3. #3
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    j'ai rien compris a ton truc, par contre, j'ai fait un truc comme ça mais ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    Regarde la fonction base64_decode
    K

  5. #5
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    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.

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Il faut alors mettre les headers HTTP qui vont bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Content-transfer-encoding: base64
    K

  7. #7
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    Tout bêtement, j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    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

  9. #9
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    j'ai tourné le truc dans tous les sens, voici ou je bloque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: ctype=\"audio/mpeg\"");
    j'ai une page qui resemble à
    UklGRiRLAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YQBLAAAAfgB+AIIAggB+AH4AggCCAH4AfgCCAIIAfgB+AIIAggB+
    si j'enlève ou non le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Transfer-Encoding: base64");
    la chaine ne change pas.
    Ai je fais une erreur ?

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Pourquoi cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: ctype=\"audio/mpeg\"");
    Essaie plutot avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    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é

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    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.

  13. #13
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    hello yogui;
    si je met ou non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    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

  15. #15
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    J'ai encodé un mp3 (qui fonctionne) avec ce script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  16. #16
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    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

  17. #17
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    je vous joins la reponse brut de mon webservice

    j'ai aussi trouvé ça dans la doc
    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 Fichiers attachés

  18. #18
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ya pas moyen que tu nous files directement les infos du webservice ? Je n'arrive à rien avec ton truc.

  19. #19
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    euh non je ne peux pas, il n'est pas accessible en réseau.

  20. #20
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Mouahaha, la chaîne qu'ils te donnent (entre les deux guillemets) fait 25.659 caractères au lieu des 25.660 annoncés.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Recupere les tag d'entete d'un fichier mp3
    Par kirbs dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/10/2006, 17h40
  2. Lire et décoder un fichier d'aide CHM
    Par bob2553 dans le forum Outils
    Réponses: 6
    Dernier message: 22/06/2005, 19h21
  3. Réponses: 3
    Dernier message: 17/05/2005, 14h26
  4. Encodage de cd en fichier mp3
    Par clovis dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 08/04/2004, 01h13
  5. Réponses: 3
    Dernier message: 25/07/2002, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo