Oluşturma ve php ile sıkıştırılmış dosyaları hizmet

4 Cevap php

Ben bir dizinden bir zip dosyası oluşturmak ve bir http indirme yoluyla kullanıcıya hizmet için aşağıdaki kodu kullanmak çalışıyorum:

 // write the file
file_put_contents($path . "/index.html", $output);

// zip up the contents
chdir($path);
exec("zip -r {$course->name} ./");

$filename = "{$course->name}.zip";

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' .urlencode($filename));
header('Content-Transfer-Encoding: binary');

readfile($filename);

Ben zip dosyası oluşturmak mümkün duyuyorum, ama http üzerinden indirmeden çalışmıyor. Ben bir ftp istemcisi kullanarak yarattığı zip dosyasını indirmeniz sonra Mac'in Stuffit Expander dosyaları gayet unzips, ama ben http üzerinden indirirseniz, mac unzipper sonsuz bir döngü oluşturur. Ben bu demek dosya course.zip.cpgz verir ve bu dosyayı ayıklayacak .. ve ve üzerinde tekrar course.zip verir ben karşıdan dosya daha sonra ayıklayacak, course.zip denir söylüyorlar.

Herkes herhangi bir fikir var mı?

Teşekkürler!

4 Cevap

  1. Bu yeniden-sıkıştırma istendiği her zaman iyi bir fikir değildir. ZIP dosyası zaten yok, sadece bunu denemek.

  2. Eğer sıkıştırılmış aktarmak istediğiniz bir uçucu dosya ya da sadece bir tek küçük bir dosya ise, ob_start('ob_gzhandler') yerine, daha basit, daha küçük, temizleyici kullanmayı deneyin. Dosya sıkıştırılmış aktarılır, ancak istemci tarafının orijinal biçiminde kaydedilir.

  3. Content-Length başlığını belirterek downloader dosyasının yolsuzluk ilerleme kontrolü, algılama sağlayan ve HTTP oturumu asmak kaçınarak, dosyanın sonuna bilmek izin için gerekli olan, belki, (Bağlantı Keep-Alive modunda ise) Bu başlık eksikliği sorunun köküdür.

Ben bu sorunu vardı ve indirdiğiniz zip dosyasının başında eklenen yeni bir hat vardı çıktı.

Ob_clean ve gömme fonksiyonları kullanılarak çözüldü

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".basename($archive_file_name));
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($archive_file_name));
    ob_clean();
    flush();
    echo readfile("$archive_file_name");

karim79 tarafından önerildiği gibi, ben bir cevap olarak benim yorum koyacağım: Eğer MIME türü application / octet-akışından uygulama / zip değiştirirsem ne olur?

Ayrıca, ben bir komut satırı zip programı kullanıyorsanız görmek, ama zip başarısı için kontrol yok ve ayrıca dosya son kullanıcılar tarayıcıya göndermek için denemeden önce varsa kontrol yok. Uygun şekilde oluşturulmuş bir zip dosyası garanti zip kullanarak elle, bir dosya adı sabit kodlama deneyin ve kod düzgün tarayıcınıza tükürmek eğer o zaman bakın.

Ne görüyorsanız arşiv programı, bir zip dosyası olarak zip dosyasını tanıma ve zip arşivi kendisi kadar zip çalıştı olmasıdır. İkinci işlem sadece yarattığı ilk dosyayı unzips, yani aslında tüm dosyayı açmadan asla. Bu zip bozuk olması nedeniyle.

Bu tarayıcı bir şekilde yükleme işlemi sırasında zip dosyasını (satır dönüşümleri kimse?) Karıştırılmış olması mümkündür. Belirtildiği gibi, mim türünü kontrol ve () Doğru MIME türünü (application / zip) ayarlamak için php başlığını kullanabilirsiniz.