9
votes

Ouverture du fichier Zip téléchargé crée un fichier CPGZ?

Si je fais l'URL pour un fichier zip, le 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.

Voici ce HTML : P>

//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");
}   


8 commentaires

Par souci de simplicité, je l'ai référé comme un fichier CPGZ, mais c'est en fait un fichier xxx.zip.cpgz . 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 ?


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 ?


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


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 () 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 () 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


6 Réponses :


4
votes

La documentation PHP pour Readfile dit que cela émettra le contenu d'un fichier et renvoyera un int.

Donc, votre code, Echo Readfile ("$ archive"); , va écho $ archive (BTW, les guillemets doubles n'ont pas de sens ici; vous devez les supprimer) , puis sortiez le int qui est renvoyé. C'est-à-dire que votre ligne devrait être: listerfile ($ archive);

En outre, vous devez utiliser un chemin local (pas un lien http: // linge) à l'archive.

totalement: xxx

enfin, si cela ne fonctionne pas, assurez-vous que FileSize ($ archive) renvoie l'exacte Longueur du fichier.


3 commentaires

Merci @cegfault pour votre aide, j'ai besoin d'utiliser un http: // 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 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?



1
votes

Vous passez l'URL à READFILE () CODE> J'aime:

header("Content-type: application/octet-stream"); 
header("Content-disposition: attachment; filename=file.zip");  


1 commentaires

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.



2
votes

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, http: // mysite ... et pas seulement un chemin de fichier sur le serveur. Comme il s'avère fopen () 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.

Voici mon code final: xxx


0 commentaires

13
votes

La réponse dans mon cas était qu'il y avait une ligne vide étant sortie avant ReadFile ().

Alors j'ai ajouté:

ob_end_clean ();

Readfile (Nom de fichier $);

Mais vous devriez probablement rechercher l'endroit où cette ligne est sortie dans votre code.


0 commentaires

2
votes

Une autre réponse possible, j'ai trouvé après de nombreuses recherches, j'ai constaté que les deux raisons possibles d'un *. zip "décompression" à un *. ZIP.CPGZ sont :

  1. Le *. Le fichier zip est corrompu
  2. L'outil "Unzip" utilisé ne peut pas Poignée> Fichiers 2 Go

    Ê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 , 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.)

    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. Unzip 6.0 sur Debian 8.2 n'avait aucun problème à décompresser l'archive.


0 commentaires

0
votes

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.


0 commentaires