File: archive.inc.php

package info (click to toggle)
zoph 1.4-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 16,632 kB
  • sloc: php: 28,044; javascript: 10,435; sql: 527; sh: 153; makefile: 4
file content (140 lines) | stat: -rw-r--r-- 4,597 bytes parent folder | download
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);
    }

}