2010-09-07 8 views
0

Je suis en train de créer un script qui permettra à un utilisateur de télécharger un fichier via une URL sans voir le nom de fichier ou l'emplacement où le fichier est stocké. Jusqu'à présent, j'ai tout construit, mais j'ai besoin de savoir comment je pourrais appeler le fichier pour l'ouvrir et le télécharger. J'ai actuellement une version de travail (code ci-dessous), mais pour une raison quelconque, le PHP corrompt le téléchargement. Chaque fois que j'essaie d'ouvrir un fichier qui télécharge sur mon bureau, je reçois un message d'erreur. Lorsque j'ouvre le même fichier sur le serveur lui-même, le fichier fonctionne très bien.Télécharger le fichier PHP

URL Structure:
http://www.example.com/download/file/cjVQv0ng0zr2

code qui initie le téléchargement

$fullpath = BASE_PATH . '../uploads/brochures/' . $vendors['0']['filename']; 

    header("Content-type: application/pdf"); 
    header('Content-disposition: attachment; filename="' . $fullpath . '"'); 

Ai-je fait quelque chose de mal qui causerait le fichier à devenir corrompu? Ai-je manqué un en-tête ou deux?

Merci à l'avance, Jake

Répondre

2

Vous devez appeler la ligne suivante après l'envoi de l'en-tête.

readfile($fullpath); 

et également régler dans l'en-tête comme ceci:

header('Content-disposition: attachment; filename="' . basename($fullpath) . '"'); 

Une chose que je ne suis pas sûr est le fullpath de $ .. essayer de voir si le fullpath de $ que vous avez est correct et vous pouvez atteindre réellement le fichier, cela doit être le chemin physique complet du fichier.

Je pense que ce serait aussi une bonne idée d'ajouter l'en-tête suivant ainsi:

header("Content-Transfer-Encoding: binary"); 
+0

Merci d'avoir répondu si vite. J'ai modifié le script pour inclure ce que vous avez mentionné, mais je reçois toujours l'erreur suivante: Une erreur s'est produite lors de l'ouverture de ce document. Le fichier est endommagé et n'a pas pu être réparé. – Jake

+0

juste pour s'assurer que votre chemin physique est correct, juste enrouler le code à l'intérieur if (is_file ($ fullpath)) {} –

+0

Je vois ce que vous dites sur le chemin du fichier, je vais vérifier et assurez-vous, mais la dernière fois vérifié, je crois que c'était correct. – Jake

0

J'ai eu un problème similaire un certain temps. Assurez-vous que vous n'avez aucun espace supplémentaire dans votre fichier de script, que ce soit avant la balise "<?php" ou après la balise "?>". Dans mon cas, le dernier caractère de mon script était "\n" au lieu du ">" attendu.

0

J'avais déjà fait face au même problème, après avoir travaillé pour moi; mettre un

while(@ob_end_clean()); 

juste avant les fonctions d'en-tête:

header("Content-Type: ". $row['p_mime']); 
header("Content-Length: ". $row['p_size']); 
header("Content-Disposition: inline; filename=".$row["p_name"]); 

Content-disposition: pièce jointe/en ligne doit être réglé selon les cas (1. invite à télécharger/2. ouvrir dans le navigateur)

REMARQUE: Veillez à ne pas répercuter la valeur de l'en-tête sur la fonction d'en-tête. Si vous faites preuve de prudence, cela ne causera aucun dommage. N'effectuez pas de fonction d'en-tête qui déclenche un message d'avertissement. symbole à ces lignes de code php. Tout le meilleur :)

+0

quelqu'un! éclaire moi! pourquoi je suis abattu? –

+0

Juste essayé cette solution et cela a fonctionné parfaitement pour moi. Merci. – DaveE

0

Assurez-vous de quitter ...

(je suis sur un blob)

header("Content-Type: " . $response['content_type']); 
header("Cache-Control: maxage=1"); 
header("Pragma: public"); //fixes ie bug 
echo trim($_data); 
exit();  
Questions connexes