Mise en situation : vous programmez un site web d'achat de fichiers musicaux et vous offrez à vos clients de télécharger des mp3 individuellement ou par album. Dans le premier cas, ça ne présente pas trop de problème. Dans le cas de l'oeuvre complète, ça peut être plus convivial pour l'acheteur de pouvoir télécharger un seul fichier compressé plutôt que de répéter l'opération pour chaque chanson.
À l'aide de l'extension Zip de PECL, on peut créer dynamiquement un nouveau fichier d'archive, y intégrer les mp3, en profiter pour inclure un fichier Lisez-moi, un fichier détaillant le sommaire des achats, les droits d'auteurs ou une photo de vous.
À supposer que les fichiers mp3 soient stockés dans un répertoire privé sur le serveur et que les pièces sont classées par artiste et par album, nous pourrons lire le répertoire source et y inclure l'ensemble des mp3 qu'il contient :
$oZip = new ZipArchive();Si votre service accepte de faire des échanges de mp3 usagés (à supposer que ça existe, au même titre que les CD et DVD), vous permettrez aux clients de déposer sur le serveur un zip contenant les mp3 et vous devrez les décompresser à la réception.
$artist = 'Gordian Knot';
$album = 'Emergent';
$inputDirectory = "/chemin/vers/$artist/$album/";
$outputDirectory = '/tmp/';
$zipFilename = "$artist-$album.zip";
if ($oZip->open($outputDirectory.$zipFilename, ZIPARCHIVE::CREATE) === TRUE) {
foreach (glob($inputDirectory . '*.mp3') as $fullpath) {
$filename = basename($fullpath);
// créer la structure de répertoires à l'intérieur de l'archive
$oZip->addFile($fullpath, "$artist/$album/$filename");
}
$oZip->addFile('invoice.txt');
$oZip->addFile('thankyou.txt');
$oZip->addFile('summary.txt');
$oZip->addFile('copyright.txt');
$oZip->close();
# @todo
# envoyer le fichier zip en téléchargement, par FTP, par courriel, etc...
// supprimer le fichier Zip
unlink($outputDirectory.$zipFilename);
}
else {
exit("Impossible d'ouvrir $outputDirectory.$zipFilename");
}
$oZip = new ZipArchive();
$pathToReceivedFile = "/path/to/deposit/Francky Vincent-Best of.zip";
$oZip->open($pathToReceivedFile);
$oZip->extractTo('D:/unzipped/');
$oZip->close();