Problème ajax et lecteur mp3 flash avec accès disque externe

Archives du forum. Utilisation de fichiers MP3 avec Ajax.

Forum
29-01-2010 15:27:59

azurul

Bonjour, j'ai un souci avec un script ajax : j'ai une page detail_album.php qui liste des titres mp3 avec pour chacun un bouton play. En appuyant sur "play" un lecteur flash se charge dans la page via ajax; ajax appelle une page listen.php qui charge le morceau en récupérant l'ID de ce dernier. Le problème est que je veux lire des mp3 depuis une disque externe, et j'ai vu qu'avec php on ne peut lire qu'en local sinon il faut appeler une autre page qui recrééra ce fichier via des entêtes. Le problème est que je n'arrive pas à envoyer l'ID de la page listen.php à la page mp3.php qui recrée le fichier mp3. Tout marche bien si je met en dur un ID fixe dans mp3.php. Comment envoyer de listen.php à mp3.php cet id, je pense qu'il y a une subtilité avec ajax et qu'il doit falloir ajouter un script ajax d'envoi dans listen.php... Voici les codes : PAGE detail_album : //partie AJAX
<style type="text/css">
  #lecteur
  {
  position:relative;
  background-color:#AAAAAA;
  left:0px;
  width:<?php echo $width;?>px;
  height:80px;
  }
  </style>

<script type='text/JavaScript'>
var xhr = null; 
function getXhr() {
  if(window.XMLHttpRequest)xhr = new XMLHttpRequest(); 
  else if(window.ActiveXObject)  { 
    try  { 
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) 
        {
     xhr = new ActiveXObject("Microsoft.XMLHTTP");
     }
  }
else  {
  alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
  xhr = false; 
  } 
}
 
function ShowLecteur(id)  {
  getXhr();
  xhr.onreadystatechange = function()  {
     if(xhr.readyState == 4 && xhr.status == 200) {
       document.getElementById('lecteur').innerHTML=xhr.responseText;
       }
     }
xhr.open("GET","listen.php?id="+id,true);
xhr.send(null);
}   
</script>
//APPEL A LA FONCTION AJAX DANS LA PAGE detail_album.php :
echo "<td align=\"center\" bgcolor=\"".$bgcolor."\" width=\"30\"><a href=\"#\" onClick=\"ShowLecteur(".$liste->Ti_ID.")\">Image Play</a></td>";
//PAGE listen.php QUI APPELLE LE FICHIER MP3 ET PERMET D'AFFICHER LE PLAYER DEWPLAYER :
$mp3="./mp3.php?id=".$_GET['id']; // C'EST LA QUE LE BAS BLESSE !!! L'ID N'EST PAS ENVOYE VERS MP3.PHP
echo "<object type=\"application/x-shockwave-flash\" data=\"dewplayer.swf?mp3=".$mp3."&autostart=1&showtime=1&volume=99\" width=\"200\" height=\"20\">
<param name=\"wmode\" value=\"transparent\">
<param name=\"movie\" value=\"dewplayer.swf?mp3=".$mp3."&autostart=1&showtime=1&volume=99\" />
</object>";
//PAGE mp3.php QUI DEVRAIT RECUPERER l'ID ET RECREER LE MP3 VIA ENTETES POUR L'ENVOYER AU LECTEUR FLASH DANS listen.php:
<?php
    $file="E:/MEDIAS/".$_GET["id"]).".mp3";
    header('X-Powered-By:');
    header('Content-Description: file transfert');
    header('Content-Disposition: inline; filename='.$file);
    header('Content-Length:'.filesize($file));
    header('Content-Type: audio/mpeg');
    echo file_get_contents($file);
?>
J'espère que ce n'est pas trop confus, merci d'avance pour votre aide. Cordialement
29-01-2010 19:02:00

webmaster

Bonjour Qu'entendez vous par "disque externe" et "php ne peut lire qu'en local"? Je pense qu'une requête POST serait plus appropriée pour passer des paramètres à un script avec Ajax. Ensuite les paramètres seront donnés en argument à la fonction send, plutôt qu'avec le nom de fichier.
xhr.open("POST","listen.php",true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");   
xhr.send("id="+id);
Voir le tutoriel Ajax qui explique ceci en détail. Evidemment $_GET serait remplacé par $_POST.
29-01-2010 19:22:35

azurul

Bonjour, j'utilise wamp sur C:/, je voudrais accéder aux mp3 sur un disque externe, chemin E:/ par exemple, or PHP me refuse la lecture des fichiers non locaux, je peux les renommer mais pas les jouer dans le player flash. Ce qui me pose pb c'est l'envoi du paramètre 'id' de listen.php vers mp3.php, ce paramètre est passé de detail_album.php vers listen.php via ajax, et je pense que c'est ce qui m'empêche ensuite d'ajouter une couche ajax de listen.php vers mp3.php, mais là ce n'est qu'une hypothèse car c'est assez flou pour moi...
01-02-2010 09:34:36

webmaster

Bonjour Le site local sous Wamp, en localhost, est considéré comme un site Web, aussi, on ne peut pas échanger de données par XMLHttpRequest avec un site Web distant dans la version actuelle de l'objet qui interdit les échanges entre sites. Ce sera possible avec la version 2 de l'objet, lorsqu'elle sera implémentée par les navigateurs. Il est cependant possible, comme expliqué dans un tutoriel, d'échanger des données entre sites avec PHP et de le contrôler par Ajax. Si le fichier est sur le même site, on devrait pouvoir l'atteindre par son URL, mais les disques physiques ne sont pas pris en compte. Le disque externe est soit considéré comme un autre site, soit comme un sous-répertoire, ce qui est automatique sous Linux. Sous Windows on peut transformer des disques en sous-répertoires avec la commande mountvol (et faire l'inverse avec la commande subst). Je pense que le script mentionné permettant l'échange entre sites par scripts PHP devrait fonctionner localement, mais dans ce cas c'est le recours à Ajax qui semble superflu.
01-02-2010 11:29:10

azurul

Bonjour, je vais essayer cette solution, merci pour votre aide. Cordialement.
© 2010-2013 Xul.fr