Forcer un téléchargement (pas forcement simple)

La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009 - 23 nov. 2009 à 11:29
La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009 - 27 nov. 2009 à 14:54
Bonjour à tous,

Je cherche a forcer le téléchargement d'un fichier image de 3 à 4Mo (sur mon site hébergé chez free.

Avec une recherche google, on trouve facilement ce genre de code :
// Envoi du fichier
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="'.$name.'"');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-length: '.filesize($lien));
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
header("Expires: 0"); 
@readfile($lien) OR die();


Ou même
	header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$name);
readfile($lien);

Ou encore
switch(strrchr(basename($lien), ".")) {
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
default: $type = "application/octet-stream"; break;
}

header("Content-disposition: attachment; filename=".$name); 
header("Content-Type: application/force-download"); 
header("Content-Transfer-Encoding: image/jpeg\n");
header("Content-Length: ".filesize($lien)); 
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
header("Expires: 0"); 
readfile($lien); 


Ces codes fonctionnent en partit. Ils m'ouvre pas de nouvelle fenêtre et me propose d'enregistrer le fichier. Sur le serveur (en local tout marche bien), lorsqu'une personne télécharge l'image elle est à tous les coups corrompus. J'ai soit une demi photo (l'autre moitier est totalement grise), soit un décalage de la photo (décalage de couleur et/ou de position).

Aucune photo télécharger n'est donc correct.

Quelqu'un sait pourquoi ce phénomène m'arrive ?
Y a t'il une solution ?


La Guite

9 réponses

cs_Mcjo Messages postés 403 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 3 septembre 2012 2
24 nov. 2009 à 15:39
Essaie ça:
switch(strrchr(basename($lien), ".")) {
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
default: $type = "application/octet-stream"; break;
}

header("Content-disposition: attachment; filename=".$name); 
header("Content-Type: $type"); 
header("Content-Length: ".filesize($lien));
        header('Content-Transfer-Encoding: binary');
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
header("Expires: 0"); 
readfile($lien); 
        ob_clean();
        flush();
        readfile($file);
        exit;



header("Content-Transfer-Encoding: image/jpeg\n");
ne semble pas bon.
1
La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009
24 nov. 2009 à 17:58
Même problème....

(j'ai enlevé un readfile($lien) qui je pense, était là par mégarde)

J'ai comme l'impression qu'il arrête le téléchargement à un certain moment.
Chose étrange, la miniature de la photo téléchargé est correcte, quand on l'affiche plein écran il en manque la moitier (ou plus ou moins).

Je désespère un peu quand même.


La Guite
0
cs_Mcjo Messages postés 403 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 3 septembre 2012 2
24 nov. 2009 à 18:19
Essaie de remplacer le
readfile($file);

par
$fp = fopen($file, "r");
$contents = '';
while (!feof($fp)) {
$contents .= fread($fp, 1024);
}
fclose($fp);

echo $contents;
0
La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009
25 nov. 2009 à 09:57
Toujours le même problème.

J'ai comme l'impression que le problème vient du téléchargement.
On dirait qu'au bout d'un certain temps, le téléchargement s'arrête, ce qui casse mon image.
Ce qui expliquerait qu'en local je n'ai pas ce problème.

Surement un problème avec mon hébergeur ?

La Guite
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Mcjo Messages postés 403 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 3 septembre 2012 2
25 nov. 2009 à 10:24
En effet, vérifie avec la fonction phpinfo(), la taille de "memory_limit" et "max_execution_time".
Si memory_limit est trop bas tu peux contourner le problème, en vidant régulièrement le buffer :


$fp = fopen($file, "r");
$contents = '';
while (!feof($fp)) {
ob_end_flush();
ob_flush();
flush();
ob_start();
echo fread($fp, 1024);
}
fclose($fp)
0
La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009
25 nov. 2009 à 14:44
Toujours le même problème. Voici le code utilisé :
switch(strrchr(basename($lien), ".")) {
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
default: $type = "application/octet-stream"; break;
}

header("Content-disposition: attachment; filename=".$name); 
header("Content-Type: $type"); 
header("Content-Length: ".filesize($lien));
        header('Content-Transfer-Encoding: binary');
header("Pragma: no-cache"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
header("Expires: 0"); 

$fp = fopen($lien, "r");
$contents = '';
while (!feof($fp)) {
ob_end_flush();
ob_flush();
flush();
ob_start();
echo fread($fp, 1024);
}
fclose($fp);


Ton idée m'a fait pensé à un autre problème que j'ai rencontré : c'est la durée d'exécution d'une page php.
Grosso modo, lorsque le traitement du fichier est trop long, le serveur le stop.
Cela pourrait il venir de ça ?

Le problème c'est que je ne peut pas utiliser la méthode set_time_limit() ou même modifier le php.ini

PS: pourtant le téléchargement de la vidéo fonctionne bien et n'est pas duré dans le temps.

La Guite
0
cs_Mcjo Messages postés 403 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 3 septembre 2012 2
25 nov. 2009 à 18:24
Je ne vois qu'une solution.
Ouvre ta photo avec un éditeur hexa et regarde si tu as un message d'erreur d'execution à la fin du fichier.
Ou sous windows tu dois pouvoir le faire facilement avec debug
0
La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009
26 nov. 2009 à 09:37
Bizar, ce matin j'ai eu 1 seul échec sur 4 téléchargement.
Sur les originales comme les télécharger je n'ai rien vu de spécial en hexa.

J'ai bien l'impression que c'est pas le code le problème, mais le serveur (ce matin moins de charge donc réussit).

Du coup la je désespère plus....

La Guite
0
La Guite Messages postés 45 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 novembre 2009
27 nov. 2009 à 14:54
Personne n'a d'idée que je pourrais creuser ?


La Guite
0
Rejoignez-nous