Bonjour,
Comme l'indique le titre de ce post, le problème est assez complexe...
Je développe une application Ajax qui, entre autres, gère des documents (une sorte de GED). Dans cette appli, je lis si possible les documents dont je connais le type MIME (donc video, pdf, audio, image, txt...). Pour lire les vidéo et fichiers audio, j'utilise les balises HTML 5 correspondantes.
Le lien utilisé n'est pas le lien réel (pour des raisons de sécurité), je fais donc un simili streaming du fichier... Ce faux stream est récupéré depuis un autre point d'entrée (donc pas en Ajax) permettant le téléchargement et la lecture du fichier (c'est la même fonction, donc sensiblement les mêmes headers, avec une différence sur le type "application/force-download" qui est changé si je veux faire de la lecture, et le header attachment qui est enlevé si je veux rester en lecture)
Seulement selon la taille de la vidéo ou du fichier audio, selon l'avancement du streaming ou de la mise en cache, lorsque je rafraichis le div contenant mes balises de lecture audio ou video, parfois la lecture est complètement bloquée, les vidéos suivantes ne se lancent pas, certaines pistes audio ne se lancent plus... Seul un F5 répare la chose... Et c'est relativement aléatoire... De ce que j'ai vu, ça fait un truc du genre :
- Vidéo de 3mn HD MP4 (~38 Mo) : si pas complètement chargée, elle plante pour le reste de l'appli (entraîne généralement les balises video suivantes complètement bloquées) ; si visionnée jusqu'au bout, on changer le contenu du div autant qu'on veut, elle se relancera (mais il faut toujours la regarder jusqu'au bout)
- Vidéo de 20s 360P MP4 (1 à 2 Mo): Aucun souci à aucun moment, je peux changer en plein milieu de la lecture, quand je veux, ça plante jamais l'appli
- Audio (MP3) de moins de 10 Mo : ça plante parfois après cinq changements d'onglets (les onglets sont le basculement entre les "propriétés" du fichier et l'aperçu, donc c'est le fameux rafraichissement de div qui plante ^^), pourquoi cinq aucune idée... Quand ça plante ce n'est pas bloquant sur les autres balise "audio", qui reste généralement utilisable...
- Audio (MP3) de plus de 10 Mo : ça plante généralement après un seul changement d'onglet, impossible de relancer ce fichier là, là encore normalement pas bloquant...
A savoir que je n'ai pas ce problème si je mets le lien réel du fichier (sans passer par le fameux fichier php), mais du coup la sécurité en prend un coup, et ce n'est pas acceptable. D'autant qu'à terme de toute manière, ce dossier sera indisponible au public, d'où la nécessité de passer par un fichier qui vérifie les droits d'accès tout ça...
Pour info, la fonction PHP qui gère le download et donc la lecture aussi c'est ça (elle est dans un namespace tout ça, vous inquiétez pas sur les \Exception ^^) :
Alors est-ce que ça pourrait venir du cache control, du pragma ? Sachant que ces quelques lignes là je ne sais absolument pas à quoi elles servent (mais n'étant pas seul sur le projet, je pense que si elles y sont elles ont une bonne raison d'y être ^^)
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 public static function download($sFilePath, $sFileName, $nFileSize = 0, $sContentType = 'application/force-download') { try { // Verification de l'existance du doc dans la BDD if (empty($sFilePath)) throw new \Exception('Le chemin vers le fichier n\'a pas été spécifié.'); // Vérification de l'existance du fichier if (!file_exists($sFilePath)) throw new \Exception('Le fichier demandé est introuvable sur le serveur de fichiers !!<br/>'.$sFilePath); // Calcul de la taille du fichier si non spécifiée $nFileSize = ($nFileSize == 0)? filesize($sFilePath) : $nFileSize; // Entetes HTTP header("Content-Type: {$sContentType}; name=\"{$sFileName}\""); header("Content-Length: ". $nFileSize); if ($sContentType == 'application/force-download') header("Content-Disposition: attachment; filename=\"{$sFileName}\""); header("Expires: 0"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); // Récupération du contenu et intégration dans le flux HTTP readfile($sFilePath); exit; } catch (\Exception $e) { header('Content-type: text/html; charset=UTF-8'); echo '<html><head><style>*{font-size:12pt;font-family:Trebuchet MS;}</style><title>Fichier non téléchargé</title></head><body><center>'. $e->getMessage() .'</center></body></html>'; die; } }
Merci d'avance pour votre aide
Partager