Génération dynamique d'archive pour une gallerie photo
Prev Next

Génération dynamique d'archive pour une gallerie photo

Génération dynamique d'archive pour une gallerie photo – 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
Tar

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

Tgz, Tbz

Pros: Very high compression ratio, constant memory usage

Cons: Can't be cached, needs a lot of CPU at each generation

Zip

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.

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()
    )
);
?>

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.

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()
    )
);
?>

Prev File_Archive Next
Exemples PEAR Manual Readers