1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
<?php
/**
* Handle archive files
* For now, it only handles creating ZIP files
* in the future it will also handle unzipping, untarring etc.
*
* This file is part of Zoph.
*
* Zoph is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Zoph is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Zoph; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* @package Zoph
* @author Jeroen Roos
*/
namespace file;
use photo\collection as photoCollection;
use log;
use user;
use ZipArchive;
/**
* Handle archive files
*
* @package Zoph
* @author Jeroen Roos
*/
class archive {
/** @var string filename of tempfile used to create zipfile*/
private $tempfile;
/** @var int maximum archive file size */
private $maxsize = -1;
/** @var ZipArchive holds created archive */
private $archive;
private $indexSize = 0;
private $indexStart = 1;
/** @var string archive::ZIP determines archive type */
const ZIP = "zip";
/**
* Create a new archive
* @param string type of archive, only ZIP is supported now, parameter is ignored
* @param string filename to create
* @param int file number, used when archive is growing bigger than "maxsize"
*/
public function __construct(private string $type, private string $filename, int $filenum) {
// $type is ignored for now
$user=user::getCurrent();
if ($this->checkZipSupport()) {
$this->archive = new ZipArchive();
$this->tempfile = "/tmp/zoph_" . $user->get("user_id") . "_" . $this->filename ."_" . (int) $filenum . ".zip";
if (file_exists($this->tempfile)) {
unlink($this->tempfile);
}
if ($this->archive->open($this->tempfile, ZipArchive::CREATE)!==true) {
log::msg("Cannot create temporary ZIP archive, " . $this->tempfile, log::FATAL, log::GENERAL);
}
}
}
/**
* Set maximum size
* Adding photos to the archive is stopped when the archive becomes too big
* this is used to spread over multiple files
* @param int maximum size in bytes
*/
public function setMaxSize($bytes) {
$this->maxsize=(int) $bytes;
}
/**
* Add photos to archive
* @param photo\collection photos to add
* @return int file number last added
*/
public function addPhotos(photoCollection $photos) {
$zipsize=0;
$file=0;
foreach ($photos as $photo) {
if ($data=@file_get_contents($photo->getFilePath())) {
$size=strlen($data);
$zipsize=$zipsize+$size;
if ($this->maxsize>0 && $zipsize>=$this->maxsize) {
break;
}
$file++;
$name = $photo->get("name");
if ($this->indexSize > 0) {
$name = sprintf("%0" . $this->indexSize . "d_%s", $file + $this->indexStart, $name);
}
$this->archive->addFromString($name, $data);
} else {
echo sprintf(translate("Could not read %s."), $photo->getFilePath()) . "<br>\n";
}
}
if (!$this->archive->close()) {
log::msg("ZIP file creation failed", log::FATAL, log::GENERAL);
}
return $file;
}
/**
* When size is set to an integer > 0, prepend each filename with an index number
* to retain file order. The index size is the length of the number, e.g.
* 2 --> 01_FILE.JPG
* 3 --> 001_FILE.JPG
* @param int index size
* @param int index number to start with
*/
public function setIndex(int $size, int $start) {
$this->indexSize = $size;
$this->indexStart = $start;
}
/**
* Checks whether ZIP support is enabled in PHP
* @return bool zip support enabled
*/
public function checkZipSupport() {
return class_exists("ZipArchive") || log::msg(translate("You need to have ZIP support in PHP to download zip files"), log::FATAL, log::GENERAL);
}
}
|