Anında PHP ZIP dosyaları

6 Cevap php

Zip kolay yolu nedir, 2 dosya sunucusu ve kuvvet download bir klasörden, say? Sunucu "zip" kaydetmeden.

    $zip = new ZipArchive();
   //the string "file1" is the name we're assigning the file in the archive
$zip->addFile(file_get_contents($filepath1), 'file1'); //file 1 that you want compressed
$zip->addFile(file_get_contents($filepath2), 'file2'); //file 2 that you want compressed
$zip->addFile(file_get_contents($filepath3), 'file3'); //file 3 that you want compressed
echo $zip->file(); //this sends the compressed archive to the output buffer instead of writing it to a file.

Can someone verify: I have a folder with test1.doc, test2.doc, and test3.doc

Yukarıdaki örnekle - dosya1 (file2 ve dosya3) sadece vb Test1.doc, olabilir

Ben "$ filepath1" ile bir şey yapmak zorunda mı? Olduğu 3 dokümanlar tutan klasör dizin?

Benim temel soru için özür dilerim ..

6 Cevap

Ne yazık ki / PHP 5.3.4-dev ve CentOS 5.x Zend Motoru v2.3.0 w ben çalışmak için yukarıdaki kodu alamadım. Bir "Invalid or unitialized Zip object" hata mesajı alıyorum buydu. Yani, o iş yapmak için, ben (ZIPARCHIVE de PHP.net kılavuzda Jonathan tarafından Baltazar örnek alınan, :: açık sayfa) aşağıdaki satırları kullanmak zorunda kaldı:

// Prepare File
$file = tempnam("tmp", "zip");
$zip = new ZipArchive();
$zip->open($file, ZipArchive::OVERWRITE);

// Stuff with content
$zip->addFromString('file_name_within_archive.ext', $your_string_data);
$zip->addFile('file_on_server.ext', 'second_file_name_within_archive.ext');

// Close and send to users
$zip->close();
header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="file.zip"');
readfile($file);
unlink($file); 

, - Eğer ;-) ram içinde tmp alanı yoksa - ama belki bu ben gibi, yukarıdaki çözüm ile mücadele ediyor başkası, yardımcı olabilir ben bu bellek / w çalışan daha farklı olduğunu sadece bilmek ve hangi performans ceza bir sorun değildir.

Sizin kodu çok yakın. Bunun yerine dosya içeriğinin dosya adını kullanmak gerekir.

$zip->addFile(file_get_contents($filepath1), 'file1');

olmalıdır

$zip->addFile($filepath1, 'file1');

http://us3.php.net/manual/en/function.ziparchive-addfile.php

Eğer bir dosya yerine bir değişken dosya eklemek için gerekiyorsa AddFromString işlevini kullanabilirsiniz.

$zip->addFromString( 'file1', $data );

Eğer zip komut programı erişiminiz varsa deneyebilirsiniz

<?php
$zipped_data = `zip -q - files`;
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="download.zip"');
echo $zipped_data;
?>

dosyaları zip istediğiniz ve zip yürütülebilir yerini zip şeyler olduğu.

Bu tabii ki, Linux ya da benzer varsayar. Windows başka bir sıkıştırma aracı ile benzer yapmak mümkün olabilir, sanırım.

Orada gösterilen bir zip extension, kullanım için de geçerlidir here.

maraspin Cevap denedim budur. Garip, ben dosya boyutunu başvuran başlık satırı kaldırarak çalışma var:

header('Content-Length: ' . filesize($file));

With the above change, the code works like a breeze! Without this change, I used to get the following error message:

End-merkezi-directory imza bulunamadı. Bu dosya bir zip dosyası değil, ya da çok parçalı arşiv tek bir disk oluşturur ya. İkinci durumda merkezi dizin ve zipfile açıklama bu arşivin son disk (ler) üzerinde bulunacaktır.

Test ortamı:

OS: Ubuntu 10.10 Browser: Firefox And the default LAMP stack.

itsols If you want to insert the 'Content-Length' do it like this:

$length = filesize($file);
header('Content-Length: ' . $length);

Nedenini bilmiyorum, ama aynı çizgide koymak eğer çöker.

Onu denemek, kullanımı php zip sınıf daha kolay olduğunu düşünüyorum, bu http://www.myee.web.id/2012/12/how-to-zip-file-on-php-script-with-php-zip-class/