2010-01-18 12 views
9

Ich versuche, einen Download eines geschützten Zip-Datei zu zwingen (ich die Menschen nicht wollen, dass es zugreifen, ohne in der ersten Anmeldung.Herunterladen von ZIP-Datei läuft eine beschädigte Datei php

Ich habe die Funktion erstellt . für die login und so, aber ich bin in ein Problem laufen, wo die heruntergeladene Datei korrumpiert ist

Hier ist der Code ist ich habe:

$file='../downloads/'.$filename; 
header("Content-type: application/zip;\n"); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-length: ".filesize($file).";\n"); 
header("Content-disposition: attachment; filename=\"".basename($file)."\""); 
readfile("$file"); 
exit(); 

Hier ist der Fehler: Cannot open file: It does not appear to be a valid archive.

Die Datei wird ansonsten gut heruntergeladen, also muss ich etwas falsch machen mit den Headern.

Irgendwelche Ideen?

Antwort

18

Dieses Problem kann verschiedene Ursachen haben. Vielleicht wird Ihre Datei nicht gefunden oder kann nicht gelesen werden und daher ist der Inhalt der Datei nur die PHP-Fehlermeldung. Oder der HTTP-Header wurde bereits gesendet. Oder Sie haben eine zusätzliche Ausgabe, die den Inhalt Ihrer Datei beschädigt.

versuchen, einige Fehlerbehandlung in Ihr Skript wie folgt hinzuzufügen:

$file='../downloads/'.$filename; 
if (headers_sent()) { 
    echo 'HTTP header already sent'; 
} else { 
    if (!is_file($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
     echo 'File not found'; 
    } else if (!is_readable($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
     echo 'File not readable'; 
    } else { 
     header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
     header("Content-Type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-Length: ".filesize($file)); 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
     readfile($file); 
     exit; 
    } 
} 
+0

Awesome Gumbo! Das hat darauf geantwortet. Das war es ... Ich denke, die gesendeten Header ist der Grund, warum es nicht funktionierte. – Troy

6

Ich wette zwei Biere, dass ein PHP-Fehler auftritt, und die Fehlermeldung vermasselt die ZIP-Datei. Die angeforderte Datei existiert wahrscheinlich nicht.

Öffnen Sie die ZIP-Datei mit Notepad oder einem ähnlichen Texteditor, und finden Sie heraus, was falsch ist.

+6

+1 nur zwei Bier? – danielrsmith

+0

id stimme ich wette, es ist ein Fehler in der 'readfile()' wie ungültige Berechtigungen, oder es kann gefunden werden ... – prodigitalson

1

Hier ist die Lösung unterhalb der Linie .htaccess eine Datei mit dem Namen in diesem Schreib erstellen SetEnv no-gzip

dont-variieren

laden Sie die Datei auf Ihre Website. Wenn Sie die Datei bereits vorhanden, dann haben Sie bitte die oben genannten Änderungen machen in diesen

0

dies versuchen zu finden, wenn es ein Fehler

error_reporting(0); 

Drucken Sie nichts, bevor die Überschriften zu schreiben; eine ob_start(), um von Ihrem Skript starten, nach dem Code bearbeiten Ihre Kopf- und dann ob_flush() und ob_clean()

1

Späte Antwort, aber vielleicht nützlich für Anwender nicht force download Arbeit machen zu können.
Fügen Sie den folgenden an der Spitze Ihres php Skript

<?php 
apache_setenv('no-gzip', 1); 
ini_set('zlib.output_compression', 0); 
Verwandte Themen