Probleme download fichier avec readfile

Petit nouveau ! | 2 Messages

24 juin 2014, 10:44

Bonjour à tous, je suis sur un projet et depuis hier je cherche une solution à ce problème qui me fait perdre la tête !

Je suis sur WAMP avec apache 2.4.4, Php 5.4.12. Je suis en POO avec pattern MVC ( mais je pense pas que ça change quelque chose vu la localisation de mon problème )

Alors le contexte : je veux faire un systeme de upload/download de fichier de tous types. La partie upload marche super bien, mais pour la partie download c'est une autre histoire.

Comment je fais =>
Quand un utilisateur arrive sur la page d'un document il a accès ( si il est connecté ) à un bouton Download et lorsqu'il clique dessus cela va lancer un module de téléchargement composé d'un controleur et d'un view.
Le controleur va rechercher les infos dans la BDD sur le fichier ( localisation, nom, type ... ) pour les fournir à la view.
Et pour finir la view contient :
<?php 
			if(file_exists ($doc->getChemin()))
			{
			header('Content-Description: File Transfer');
			                  // header('Content-type: '.$mine.''); <== bizarrement il ne s'affiche pas dans le apache_response_headers() donc je l'ai mis en commentaire
			header('Content-Disposition: attachment; filename="'.$nom.'"');		
			header('Content-Length: ' . filesize($doc->getChemin()));
			header('Content-Transfer-Encoding: binary');
			                  // print_r(apache_response_headers()); <== c’était pour voir si la réponse contenait bien toutes mes modifications
			ob_clean();
			flush();
			readfile($doc->getChemin());
                        exit;
			}
                        else
			echo "FAIL";

Le fichier existe, tout va bien, et lorsque c'est un fichier PDF c'est même génial car il n'y a aucun problème. Par contre, pour les autres types de fichier => CACA !
Le fichier ne s'ouvre pas.


J'ai donc ouvert dans notepad++:
l'image A qui est l'image que j'ai utilisé pour l'upload
l'image B qui est l'image qui se trouve sur le serveur une fois l'upload effectué
l'image C qui est l'image récupérée par download

L'image A et B donc identique et détectée en encodage ANSI
L'image C est détecté en encodage UTF-8 et si je dis à notepad : " Non c'est pas UTF8 mais ANSI " et que j'enregistre, l'image C s'ouvre normalement.


Donc peut être ( ça se trouve je dis des bêtises et ça a rien avoir ) qu'il faut que le serveur envoie le fichier avec le bonne encodage ... mais je ne sais pas faire.

Si vous avez des suggestions , voir même des solutions je suis preneur et disposez à vous fournir des informations supplémentaire.
( Vous êtes peut-etre ma derniere chance )

ViPHP
xTG
ViPHP | 7331 Messages

24 juin 2014, 21:02

Essaies de rajouter un :
header('Content-Type: application/octet-stream');
Je pense qu'actuellement il le prend comme du texte et donc applique l'encodage serveur par dessus le fichier (comme quand tu fais un bête echo).

Petit nouveau ! | 2 Messages

25 juin 2014, 09:08

merci de ta réponse, mais ça change rien ^^

D'ailleur j'ai fais un print_r(apache_response_headers()); et le content-type n’apparaît pas ( c'est normal ou une cause du problème ? )
Array
(
    [X-Powered-By] => PHP/5.4.12
    [Expires] => Thu, 19 Nov 1981 08:52:00 GMT
    [Cache-Control] => no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    [Pragma] => no-cache
    [Content-Description] => File Transfer
    [Content-Disposition] => attachment; filename="Classeur1.xlsx"
    [Content-Length] => 14001
    [Content-Transfer-Encoding] => binary
)
Je suis tellement désespéré que j'imagine tous les problèmes les plus fous car j'en ai essayé des trucs sans succès

ViPHP
xTG
ViPHP | 7331 Messages

25 juin 2014, 20:12

Je n'ai jamais eu de problème et donc jamais eu à investiguer avec apache_response_headers.
Et je n'ai malheureusement pas plus d'idées. :?