2013-02-09 14 views
6

Otrzymuję pobrany plik ZIP z następującego kodu bez żadnego błędu, ale pobrany plik zip jest pusty lub uszkodzony, a rozmiar zawsze wynosi około 200 bajtów. tj. Nie mogę otworzyć tego pliku zip. także ZipArchive :: getStatusString() jest również pokazywanie "Brak błędu"Pobieranie uszkodzonego lub pustego zip przez ZipArchive php

kod

jest:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
+0

to daje mi fałszywe. oznacza to, że katalog $ zipname nie został utworzony. Ale nie otrzymuję msg z "Nic w koszyku" zamiast pobierania pliku zip. –

Odpowiedz

3

To jest moje najlepsze przypuszczenie. To, co dzieje się nie tak, to to, że wartości, które przechowujesz, nie są prawdopodobnie rzeczywistymi ścieżkami do plików.

Pamiętaj: Nie możesz przekazać adresów URL do $zip->addfile(), potrzebujesz rzeczywistych plików.

5

Spróbuj znaleźć pełna ścieżka i nazwa pliku tuż przed $zip->close();

$filename = $zip->filename; 

i używać zamiast $zipname podczas czytania pliku i pobierania rozmiaru pliku

+0

@Pony Sprawdź to również .. Nadal pojawia się ten sam problem. Myślę, że katalog dla pliku nie jest tworzony. Również zaznaczone "var_dump ($ filename)" pokazuje dokładną ścieżkę. –

+0

Czy przypisałeś tę zmienną przed wywołaniem '$ zip-> close()'? –

+0

Pracował jak urok! Dzięki :) – Scott

0

Nawet trudne pytanie to zostało zorientowali się, będę pisać co się dowiedziałem jak uszkodzone zamki mogą być tworzone:

Dokonując archiwum zip często debugowania z echa/print_r poleceń. Jeśli tego nie zrobisz, wyjściowy plik zip będzie uszkodzony.

Przykład opiera się na pytaniu:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { 
     // to fix your corrupt zip file, remove this line. 
     echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
1

Dodając do tego wątku, chociaż oryginalny problem został rozwiązany, ponieważ ja właśnie spędziliśmy kilka godzin z podobnym problemem.

Okazuje się, że wszystkie pliki muszą istnieć podczas wykonywania $ zip-> close(), niezależnie od tego, kiedy użyjesz $ zip-> addFile() do ich dodania.

Jeśli więc utworzysz pliki tymczasowe, dodaj je do swojego pliku ZIP, a następnie usuń, zanim użyjesz metody close(), możesz otrzymać puste/uszkodzone archiwum.

0

Rozwiązałem ten sam problem, przenosząc kod do tego samego folderu, w którym znajdowały się pliki, które chciałem dodać do archiwum ZIP.

Powiązane problemy