Bonjour,
Avant de commencer, je précise que j'espère poster au bon endroit. Mon problème concernant plusieurs langages et pratiques, j'ai choisis l'endroit qui me semblait le plus approprié.
EDIT : Mais j'aurais peut-être du aller dans le forum PHP.
Je développe un lecteur audio en HTML5 avec le plugin jPlayer pour jQuery.
Mon but est de proposer à mes visiteurs de la musique en écoute, sans qu'elle puisse être télécharger (ou tout du moins en compliquant le plus possible la tâche).
Donc dans ma balise <audio>, au lieu de la source direct vers le fichier audio, j'utilise un script PHP qui vérifie que le Referer viennent bien du site et qui transmet le fichier au lecteur. Cela stop déjà le commun des mortels. Je verrai plus tard pour faire mieux.
Mais voilà je me heurte à un problème...
Une fois sur deux (parfois plus, parfois moins) le lecteur ne parvient pas à récupérer le fichier et j'ai droit à une erreur dans la console de Chrome :
Et les messages de debugging de jPlayer me renvoie ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part GET [url]GET http://monsite/media.php?f=unemusique.m4a net::ERR_CONTENT_LENGTH_MISMATCH
Et autre étrangeté, cela n'arrive qu'avec les .m4a et les .ogg, jamais avec les .mp3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 jPlayer 2.6.0 : id='jp-player-1' : Error! Media URL could not be loaded. Check media URL is valid. Context: http://monsite/media.php?f=unemusique.m4a
J'en déduis donc qu'il y a un problème avec les headers que je génère en PHP.
Voici la fonction que j'utilise pour récupérer les fichiers :
Je ne l'ai pas écrit et j'avoue que je suis encore perdu en ce qui concerne la manipulation de fichier. Je préfère donc vous laissez la décortiquer.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 function stream($file, $content_type = 'application/octet-stream') { @error_reporting(0); // Make sure the files exists, otherwise we are wasting our time if (!file_exists($file)) { header("HTTP/1.1 404 Not Found"); exit; } // Get file size $filesize = sprintf("%u", filesize($file)); // Handle 'Range' header if(isset($_SERVER['HTTP_RANGE'])){ $range = $_SERVER['HTTP_RANGE']; }elseif($apache = apache_request_headers()){ $headers = array(); foreach ($apache as $header => $val){ $headers[strtolower($header)] = $val; } if(isset($headers['range'])){ $range = $headers['range']; } else $range = FALSE; } else $range = FALSE; //Is range if($range){ $partial = true; list($param, $range) = explode('=',$range); // Bad request - range unit is not 'bytes' if(strtolower(trim($param)) != 'bytes'){ header("HTTP/1.1 400 Invalid Request"); exit; } // Get range values $range = explode(',',$range); $range = explode('-',$range[0]); // Deal with range values if ($range[0] === ''){ $end = $filesize - 1; $start = $end - intval($range[0]); } else if ($range[1] === '') { $start = intval($range[0]); $end = $filesize - 1; }else{ // Both numbers present, return specific range $start = intval($range[0]); $end = intval($range[1]); if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file } $length = $end - $start + 1; } // No range requested else $partial = false; // Send standard headers header("Content-Type: $content_type"); header("Content-Length: $filesize"); header('Accept-Ranges: bytes'); // send extra headers for range handling... if ($partial) { header('HTTP/1.1 206 Partial Content'); header("Content-Range: bytes $start-$end/$filesize"); if (!$fp = fopen($file, 'rb')) { header("HTTP/1.1 500 Internal Server Error"); exit; } if ($start) fseek($fp,$start); while($length){ set_time_limit(0); $read = ($length > 8192) ? 8192 : $length; $length -= $read; print(fread($fp,$read)); } fclose($fp); } //just send the whole file else readfile($file); // log downloads if (!LOG_DOWNLOADS) die(); $f = @fopen(LOG_FILE, 'a+'); if ($f) { @fputs($f, date("m.d.Y g:ia")." ".$_SERVER['REMOTE_ADDR']." ".$fname."\n"); @fclose($f); } exit; }
Si vous souhaitez tester par vous même, voici le lecteur -> http://resilience-watch.com/lstoller...yer/index.html
Testez avec Firefox ou autre navigateur ne supportant pas le mp3.
Bref...
Ma question est donc, d'où vient cette erreur et comment la corrigé?
J'espère que vous saurez m'aider. Merci d'avance.
EDIT :
Problème réglé! Et franchement, je me sens con...
En fait le problème venait d'une erreur au transfert des fichiers audio sur le FTP. J'ai surement été déconnecté un instant pendant le transfert et ça à corrompu les fichiers.
Je m'en suis rendu compte en retéléchargeant les fichiers et en me rendant compte que quand je les ouvrais dans mon lecteur préféré, il ne m'affichait pas la durée correcte. D'où cette fameuse erreur "net::ERR_CONTENT_LENGTH_MISMATCH".
Maintenant je n'ai plus de soucis.
Au passage si un modo pouvait déplacer le sujet dans le bon forum (PHP), je lui en serait reconnaissant.
Partager