2009-12-07 7 views
4

Je suis en train de télécharger un fichier via mon serveur, en streaming le téléchargement.readfile ne fonctionne pas correctement

Ceci est mon script:

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=http://user:[email protected]/file.bin'; 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . $r[2]); 
ob_clean(); 
flush(); 
readfile($fileName); 
exit; 

example.com est pas ce que je suis vraiment à l'aide, je ne voulais pas montrer l'URL réelle. :) Quand je vais à ce fichier dans mon navigateur Web, une invite de téléchargement ne s'affiche pas et rien ne se passe. $r[2] est la longueur du contenu en octets du fichier et $fileName correspond à la même URL que celle utilisée dans l'en-tête de pièce jointe. Je ne sais vraiment pas ce que je fais de mal.

+1

Je ne comprends pas le raisonnement derrière votre service une URL absolue avec nom d'utilisateur et mot de passe (?!?!? !) que le nom du fichier de téléchargement. Vous voulez élaborer? –

+0

@Joseph: les tags n'appartiennent pas au sujet – SilentGhost

Répondre

5

readfile(); a besoin du chemin absolu du fichier sur la machine plutôt que d'une URL.

par exemple. /home/person/file.exe

+1

Salut, j'ai déjà essayé et le script ne marche toujours pas quand je le teste avec un fichier local. Même si cela a fonctionné, j'ai toujours le problème d'ouvrir une URL avec readfile() n'est-ce pas? php.net dit que cette fonction accepte une URL mais je n'arrive pas à la faire fonctionner. Merci pour la réponse. – Joseph

+0

Depuis la page de fonction php "Une URL peut être utilisée comme nom de fichier avec cette fonction si les wrappers fopen ont été activés.Voir fopen() pour plus de détails sur la spécification du nom de fichier.Voir la liste des protocoles/wrappers supportés pour les liens à des informations sur les capacités des différents wrappers, des notes sur leur utilisation et des informations sur les variables prédéfinies qu'ils peuvent fournir. " –

0

Il manque ) à la fin de la ligne d'en-tête de nom de fichier, mais je suppose que cela s'est produit lors de l'édition de la ligne. Pour ce que cela vaut, l'exécution de votre exemple de code donne une invite de téléchargement, ne l'a pas vraiment testé, mais c'est peut-être quelque chose avec la configuration serveur/client - pas le code.

0

à mon humble avis, le problème est la taille du fichier, essayez d'obtenir la taille du fichier sur http (regardez cette fonction): http://codesnippets.joyent.com/posts/show/1214

donc modifier de

header('Content-Length: ' . $r[2]); 

à

header('Content-Length: ' . get_remote_file_size($fileurl)); 

Espoir vous résolvez votre problème.

0

J'ai trouvé un moyen de télécharger une image par exemple, mais cela pourrait aider avec n'importe quel type de fichier. Il télécharge un fichier sans utiliser readfile. Je sais que cela peut être maladroit, mais parfois nous avons besoin de solutions de contournement pour faire le travail.

Essayez ceci, où $src = 'http://external-server/remote-image.jpg'

$url_stuff = parse_url($src); 
$port = isset($url_stuff['port']) ? $url_stuff['port'] : 80; 
$fp = fsockopen($url_stuff['host'], $port); 
$query = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n"; 
$query .= 'Host: ' . $url_stuff['host']; 
$query .= "\n\n"; 
$buffer=null; 
fwrite($fp, $query); 
while ($tmp = fread($fp, 1024)) 
{ 
    $buffer .= $tmp; 
} 

preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts); 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=your_file.bin'); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 

$content = substr($buffer, - $parts[1]); 
echo $content; 

cela est testé et fonctionnel ;-)

Questions connexes