Jak streamujete velké ZIP archivy?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
sidrach
Člen | 23
+
0
-

Zdravím, druhý den se potýkám s následujícím problémem, který tu už určitě někdo řešil.

Situace: Máte 639 originálů fotografií v albu, které chcete předat formou ZIP archivu ke stažení uživateli. Celková velikost po zabalení je cca 1.3GB.

Vytvářet archiv v paměti je no-way a generovat to na disk je na dlouho a zabere to zbytečně moc místa. Takže archiv je nutno streamovat.

Zkoušel jsem třídy:

  • maenchen/zipstream-php – streamuje v poho, ale jen do cca 1.2GB, pak neočekávaný eof.
  • mcnetic/zipstreamer – to samé
  • phpzip/phpzip – streamuje celý archiv, ale stejně hlásí archiv neočekávaný eof.
  • grandt/phpzipmerge – vyžaduje fotky nejdřív jednotlivě nebo ve skupinách zabalit (prasárna) a pak streamovat sloučený archiv, ale jako jediný funguje.

Zkoušel jsem i variantu kdy se ajaxem kvůli obejití časového limitu postupně plní archiv jednou fotkou po druhé, ale je to taky prasárna a trvá to déle než samotné stažení i v případě že se slučuje archiv bez rekomprese.

Ideální by byl nějaký download manager třeba v javě, ale chrome blokuje NPAPI, takže to taky přestává být použitelné. Moc mě nenapadá jak to vymyslet.

newPOPE
Člen | 648
+
0
-
  1. Urobil by som button na download
  2. Zostavim archiv na disku (asynchronne)
  3. Poslem userovi link na download (z nejakym divnym nazvom) a o prenos sa postara web server alebo nejaky cloud napr. S3.

Plus este nejaka invalidacia (mazanie) archivov po danom case.

Editoval newPOPE (10. 7. 2015 14:13)

sidrach
Člen | 23
+
0
-

To jsem zkoušel a je to funkční možnost, ale vadí mi tam ta nutnost ukládat 2× skoro 1.3GB. Jednou ve fotkách ze kterých se generují zmenšeniny atd. a podruhé v archivech, které musím cronem jednou za čas mazat z tempu.

Asi to vyřeším rozdělením na více archivů streamovaných současně, nebo začnu hledat bug který rozsypává ty soubory. Pod 1.2GB to funguje v pohodě.

llook
Člen | 407
+
0
-

Není ten EOF způsobený time limitem?