2013-08-23 16 views
7

Fellow koderów:ZipArchive PHP dodając tylko pliki bez katalogów z całej ścieżki

nienawidzę to pytanie, jak to było, wierzę poprawnie odpowiedział dwa razy:

  1. Here

  2. And here

Więc pr oblem to: po rozpakowaniu pobranego pliku "file.zip", po rozpakowaniu zawiera wszystkie foldery ze ścieżki, nawet trudne jest określenie lokalnego pliku w funkcji addFile. Chciałbym, żeby plik zip nie zawierał podfolderów, tylko pliki.

$zipname = str_replace(' ', '_', $obj['Name']) . '.zip'; 

$zip = new ZipArchive(); 

$zip->open($zipname, ZipArchive::CREATE); 
foreach ($files as $file) { 
    // $file looks like this: webroot/uploadify/files/file.jpg 
    $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME)); 
} 

$zip->close(); 

header('Content-Description: File Transfer'); 
header('Content-Transfer-Encoding: binary'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header("Content-type: application/zip"); 
header("Content-Disposition: attachment; filename=" . $zipname); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
header('Content-Length: ' . filesize($zipname)); 

readfile($zipname); 

Czy ktoś może zobaczyć, jaki jest problem z tym kodem?

Dodatkowe informacje:

I ofc, stosowanie ścieżki w stosunku do webroot, ale hierarchia folder wydobytego katalogu po: ekstraktu pliku -> 'my_file.zip' jest C-> xampp -> htdocs-> my_cakephp_web_app-> app-> webroot-> pliki który nie jest dokładnie to, co chciałem osiągnąć :)

PHP 5.4.4

Windows XP, XAMPP

EDYCJA

Próbowano użyć biblioteki http://www.phpconcept.net/pclzip/ i wystąpił ten sam problem. Również na moim domowym komputerze (win7) ten kod działał dobrze.

Pojawia się pytanie: Czy są jakieś ustawienia, które powinienem spełnić, o których nie jestem świadomy?

Odpowiedz

2

Trzeba przetestować każdy plik, aby zobaczyć, czy jest to plik (a nie katalog, dowiązanie symboliczne, etc):

foreach ($files as $file) 
{ 
    if(filetype($file) == 'file') { 
     $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME)); 
    } 
} 

ten korzysta filetype, ale można też użyć is_file.

+0

nie pomogło, nadal zachowuje się tak samo .. –

+0

Jeśli masz czas, spójrz na moją odpowiedź i daj mi znać, dlaczego to działa :) –

4

Uruchomiłem twój kod i działa zgodnie z oczekiwaniami. Są więc 3 rzeczy, które mogą się nie udać z tego, co widzę.

Spróbuj użyć tych flag w przypadku, gdy stary plik nadal istnieje i nie jest nadpisywany (nie jest jasne, co to jest $ obj ['Nazwa']) Jeśli czytasz komentarze w podręczniku php, tam są różne stopnie sukcesu, używając ZIPARCHIVE :: CREATE vs ZIPARCHIVE :: OVERWRITE, więc być może użycie obu zadziała.

$zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 

pathinfo może być braku i powrocie całą ścieżkę lub null jakiegoś powodu

Czy to możliwe, aby zrobić var_dump na wyjściu pathinfo, żeby potwierdzić to, czego można oczekiwać, że będzie?

foreach ($files as $file) 
{ 
    var_dump(pathinfo($file, PATHINFO_BASENAME)); 

    // $file looks like this: webroot/uploadify/files/file.jpg 
    // $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME)); 
} 

Być może jest to błąd z OS Version/php z funkcją addFile (mało prawdopodobne, chwytając się brzytwy tu nie widzę żadnego innego wytłumaczenia)

+0

Jeśli masz czas, spójrz na moja odpowiedź proszę i daj mi znać, dlaczego działa :) –

1

mam bladego pojęcia, dlaczego tak jest działa :)

ja rzeczywiście wierzę, że mój komputer wszedł w tryb Skynet i dostał metodę addFile pracować jakoś :)

Każdy, kto potrafi przekonująco wyjaśnić, co się dostanie premię +50 :)

$zipname = str_replace(' ', '_', $obj['Name']) . '.zip'; 

    $zip = new ZipArchive; 

    $zip->open($zipname, ZipArchive::CREATE); 

    foreach ($files as $file) 
    { 
     // the str_replace made it work??? 
     $zip->addFile(str_replace('/webroot', '', getcwd() . '/' . $file), pathinfo($file, PATHINFO_BASENAME)); 
    } 

    $zip->close(); 

    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=" . $zipname); 
    header('Content-Length: ' . filesize($zipname)); 

    readfile($zipname); 

EDIT:

Również po trochę więcej kłopotów z plików tymczasowych nie deleteing się, przeszedłem do http://www.phpconcept.net/pclzip/, który działa dobrze.

Również Alix Axel wspomniano PharData poniżej, biorąc pod uwagę ilość punktów zdobył on tutaj, jestem biorąc pod uwagę jego podejście jak dobrze ..

+0

Ciekawe, jaka jest wartość getcwd(). Wygląda na to, że tłumaczysz względną ścieżkę do absolutnej ścieżki. – bumperbox

+0

Jest to od 1 komentarza do podręcznika php dla $ zip-> addFile. Uwaga: wywołanie $ zip-> addFile() na pliku, który nie istnieje, zakończy się sukcesem i zwróci wartość TRUE, opóźniając niepowodzenie, dopóki nie wykonasz ostatecznego wywołania $ zip-> close(), które zwróci FAŁSZ i potencjalnie pozostawi ci drapanie Twoja głowa. Jeśli dodajesz wiele plików do pliku ZIP, a twoja komunikacja $ zip-> close() zwraca FALSE, upewnij się, że wszystkie dodane pliki faktycznie istnieją. Warto również sprawdzić każdy plik z file_exists() lub is_readable() przed wywołaniem $ zip-> addFile() na nim. – bumperbox

+0

getcwd() zwraca "C: \ xampp \ htdocs \ test_tool \ app \ webroot". Przeczytaj także ten komentarz i zorientowałeś się, że od utworzenia archiwum zip działa (powinien wydrukować $ zip-> close(), będzie wiedział, kiedy następnym razem będziesz mieć kłopoty). –

2

W PHP 5.3 powinien to zrobić:

$phar = new PharData('file.zip'); 

// add all files in the folder, only include files with extensions 
$phar->buildFromDirectory('/directory', '~[.][0-9a-z]+$~i'); 

Możesz także użyć PharData::buildFromIterator z flagą LEAVES_ONLY.

+0

Cześć, próbowałem twojego kodu w ten sposób: '$ phar = new PharData ('tmp_zips/file.zip'); $ Pharmacia> buildFromDirectory ('/ Uploadify/files/test1', '~ [0-9a-Z] + $ ~ i [.]'); ' mam ten błąd: ' RecursiveDirectoryIterator :: __ konstrukt (/ uploadify/files/test1,/uploadify/files/test1): System nie może odnaleźć określonej ścieżki. (code: 3) ' –

+0

@IgorLacik: Wydaje się sugerować, że źle wpisałeś swoją ścieżkę. –

Powiązane problemy