Dynamic generation of archive files for a gallery -- How to use File_Archive for a photo/video gallery
One possible use case of File_Archive is to
dynamically generate archives that contain pictures or videos from a gallery.
The choice of the file format is important if you want an efficient
generation. Let's see what are the possibilities:
- 1. Tar
- 2. Tgz, Tbz
- 3. Zip
Pros:
Generation very efficient, constant memory usage, no need to cache
Cons:
No compression (but anyway images or video can hardly be
compressed), not as widely used as Zip
Pros:
Very high compression ratio, constant memory usage
Cons:
Can't be cached, needs a lot of CPU at each generation
Pros:
Intermediate result can be cached, compressed, you can choose
the compression level, widely used
Cons:
Compression ratio lower than for Tgz/Tbz
We will focus on Tar and Zip generation, Tgz and Tbz are too
CPU expensive for an "on the fly" archive generation.
Tar generation
<?php
require_once "File/Archive.php";
// $files is an array of path to the files that must be added to the archive
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.tar',
File_Archive::toOutput()
)
);
?>
|
Zip generation
The main advantages of the Zip generation is that it is not very expensive
(due to the ability to cache the result), and widely used.
I think 2 viable options are to generate uncompressed Zip archives
(since you don't reduce a lot the size of picture and video files by
compressing them)
or to generate compressed Zip archive using a cache system.
Example 43-1. On the fly creation of an uncompressed ZIP archive
<?php
require_once "File/Archive.php";
File_Archive::setOption('zipCompressionLevel', 0);
// $files is an array of path to the files that must be added to the archive
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.zip',
File_Archive::toOutput()
)
);
?>
|
|
Example 43-2. On the fly creation of a compressed ZIP archive with a cache
<?php
require_once "File/Archive.php";
require_once "Cache/Lite.php";
// See the documentation of cache lite for the meaning of the $options array
// fileNameProtection must be left to the default true value
// automaticSerialization is not required and should be left to false
$options = array('cacheDir' => 'tmp');
File_Archive::setOption('cache', new Cache_Lite($options));
File_Archive::setOption('zipCompressionLevel', 9);
// $files is an array of path to the files that must be added to the archive
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.zip',
File_Archive::toOutput()
)
);
?>
|
|
Putting it all together
Since generating a zip or a tar archive is pretty much the same code,
you can write a simple code that lets the user choose what format he wants.
The following code is taken from a code I really use in my gallery.
Example 43-3. Custom archive
<?php
$allowedFormats = array('tar', 'zip');
if (!in_array($_GET['type'], $allowedFormats)) {
die('Type ' . htmlspecialchars($_GET['type']) . ' is either unknown or not allowed');
}
require_once "File/Archive.php";
File_Archive::setOption('zipCompressionLevel', 0);
/**
* I skipped the generation of the $files array since it really
* depends on you gallery and what files the user requires
*/
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.' . $_GET['type'],
File_Archive::toOutput()
)
);
?>
|
|