Si je fais l'URL pour un fichier zip, le Voici ce HTML : P> href code> d'un lien et cliquez sur le lien, mon fichier zip est téléchargé et en ouvrant son contenu, car je m'attends.
//business logic to determine if user can download
if($yesCanDownload){
$archive='https://mysite.com/uploads/my-archive.zip';
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($archive));
header("Content-Length: ".filesize($archive));
ob_clean();
flush();
echo readfile("$archive");
}
6 Réponses :
La documentation PHP pour Readfile dit que cela émettra le contenu d'un fichier et renvoyera un int.
Donc, votre code, En outre, vous devez utiliser un chemin local (pas un lien http: // linge) à l'archive. p> totalement: p> enfin, si cela ne fonctionne pas, assurez-vous que Echo Readfile ("$ archive"); code>, va écho
$ archive code> (BTW, les guillemets doubles n'ont pas de sens ici; vous devez les supprimer) , puis sortiez le
int code> qui est renvoyé. C'est-à-dire que votre ligne devrait être:
listerfile ($ archive); code> p>
FileSize ($ archive) code> renvoie l'exacte Longueur du fichier. P> p>
Merci @cegfault pour votre aide, j'ai besoin d'utiliser un http: // code> car le fichier zip est réellement sur un serveur distant. Alors, oui maintenant que je me rendais compte, ReadFile () n'a aucun sens dans ce contexte. Avoir d'autres suggestions?
Comment chargez-vous le fichier distant? C'est probablement l'endroit où le problème est. Je voyais que vous utilisez peut-être un godet S3. J'ai eu un problème sur Rackspace Cloudfiles où le fichier lisait également les en-têtes et il y avait des EXTRA CRLF ("\ r \ n") dans le fichier. Assurez-vous que vous appelez correctement le fichier - essayez d'abord avec un fichier .txt ou quelque chose. Si vous rencontrez toujours des problèmes, postez votre code S3 actuel (supprimer le nom d'utilisateur / apkey / etc.), car cela pourrait être le problème.
Bonjour @cegfault, je n'ai actuellement aucun code S3 dans mon / Candownload code> PHP. Ce que j'ai est exactement ce que vous voyez. J'apprends juste le S3 SDK. Je vois qu'il y a un getObject appeler mais pas sûr comment s'adapter à ma situation. Je ne suis pas un noob total tel que je peux télécharger sur mon S3, mais toujours quelque peu confus, pourriez-vous pouvoir vous conseiller?
Vous passez l'URL à READFILE () CODE> J'aime:
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=file.zip");
Le zip est en fait dans un godet S3 et non mon application. Ma question semblait assez compliquée, c'est pourquoi je devais inclure l'URL complète.
OK, j'ai répondu à ma propre question.
Le problème principal, que je n'avais pas précisé, était que le fichier n'était pas localisé sur mon serveur d'applications. C'était dans un godet Amazon AWS S3. C'est pourquoi j'avais utilisé une URL complète dans ma question, Voici mon code final: p> http: // mysite ... code> et pas seulement un chemin de fichier sur le serveur. Comme il s'avère
fopen () code> peut ouvrir les URL (tous les objets de godets S3 ", aka fichiers, avoir des URL) de sorte que c'est ce que j'ai fait. P>
La réponse dans mon cas était qu'il y avait une ligne vide étant sortie avant ReadFile (). P>
Alors j'ai ajouté: p>
ob_end_clean (); p>
Readfile (Nom de fichier $); P> blockQuote>
Mais vous devriez probablement rechercher l'endroit où cette ligne est sortie dans votre code. P>
Une autre réponse possible, j'ai trouvé après de nombreuses recherches, j'ai constaté que les deux raisons possibles d'un Être un utilisateur Mac, la deuxième raison était la cause de mon problème décompressez le fichier: l'outil Standard Mac OS est Utilitaire d'archivage em>, et il ne peut apparemment pas gérer> 2 Go de fichiers. (Le fichier en question pour moi était une zippée 4GB Raspbian image disque.) P>
Ce que j'ai fini par faire était d'utiliser une machine virtuelle Debian, déjà existante dans une boîte virtuelle sur mon Mac. *. zip code> "décompression" à un
*. ZIP.CPGZ code> sont : p>
*. Le fichier zip code> est corrompu li>
Unzip code> 6.0 sur Debian 8.2 n'avait aucun problème à décompresser l'archive. P>
Dans mon cas, j'essayais de créer le fichier dans un répertoire au-dessus de Public_HTML et les règles de l'hébergement ne l'ont pas permis. P>
Par souci de simplicité, je l'ai référé comme un fichier CPGZ, mais c'est en fait un fichier
xxx.zip.cpgz code>. De Google, je pense que c'est une zipping du fichier zip. Il semble que je télécharge que je télécharge un fichier dont le contenu ne peut peut-être pas être lu car les instructions d'en-tête () étaient déjà déterminées par
/ candownload code>?
Essayez de changer l'extension en .txt et voyez si vous avez du texte brut.
Vous voulez donc dire
https://mysite.com/uploads/my-archive.txt code>?
Je veux dire après que vous téléchargiez le fichier, changez d'extension à .txt et ouvrez-le.
Merci @jprofitt je pense que vous êtes sur le problème, lorsque j'ai ouvert le fichier ZIP en tant que txt, j'ai eu le message d'erreur suivant:
ne peut pas modifier les informations d'en-tête - les en-têtes déjà envoyés par code>
Cela signifie qu'il existe un autre code de votre programme qui envoie une sortie (ou des en-têtes) avant d'appeler
en-tête () code> ici. Il y a probablement une erreur ou une autre sortie avant le code que vous avez posté.
Oui, vous êtes correct, la première erreur est
FileSize () [ fonction.filesize ]: STAT a échoué pour https://mysite.com/uploads/my- archive.php << / code>. Il ressemble à ce
en-tête () et filesize () code> Les problèmes sont secondaires à un problème réel, comment appeler le fichier ZIP de mon godet S3, en regardant toujours via le SDK AWS PHP ...
Le SDK est la voie à suivre; Vous voudrez peut-être simplement copier temporairement l'archive sur le serveur local et obtenir ce problème fermé (c.-à-d. Éliminer toutes les erreurs en plus d'AWS), puis essayez d'ajouter un code AWS pour effectuer l'appel à distance. Si vous avez des problèmes là-bas, vous devriez ouvrir une autre question