PHP: $zip->addFile проблемы

Я написал простой скрипт для добавления файлов в архив. После долгих царапин я не могу заставить скрипт работать.

У меня есть файл php, который читает из флажка, файл / ы, выбранные в флажке, добавляются в массив $ file.

$path = ('a path');
$dir = scandir('another path');

    if(isset($_POST["submit"])){
    if(!isset($_POST["File"])){
        echo 'A file must be selected to archive it';
        } else { 
            require_once('zip_function.php');
            $file = $_POST['File'];
            $goZipper = goZipper($file, $path);
            if($goZipper == false) {
                echo ("Error");
            } else { 
                echo ("Success");
            }
        }   
    }

Вызывается функция goZipper и ей передается $ file и назначение, функция ниже.

function goZipper($files, $destination = '',$overwrite = true) {
    if(file_exists($destination) && !$overwrite) {
        echo"File exists";
        return false; 
        }
    if(count($files)){
        $zip = new ZipArchive();
            if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true){
                echo"Error opening destination";
                return false;
            } 
            foreach($files as $file){
                $zip->addFile($file,basename($file));

                    echo("<pre>");
                    var_dump($zip);
                    exit();

            }
            $zip->close();
            return file_exists($destination);
            }
            else{
                return false;
            }
    }

Функция возвращает true каждый раз, когда она вызывается. Но файлы не добавляются. Кто-нибудь может заметить очевидную ошибку здесь?

2 ответа

Решение

ZipArchive::addFile() ожидает, что первым параметром будет строка, содержащая имя файла. Но вы передаете ему значение $_POST['File'], которое является массивом, а $_POST['File'] является двумерным массивом.
Смотрите здесь содержимое $_POST['File'].

Что вам нужно сделать, это изменить эту строку:

$zip->addFile($file,basename($file));

Для того, чтобы:

$zip->addFile($file['tmp_name'],$file['name']);

Zip::addFile нужен абсолютный путь в первом параметре, а вторым параметром будет имя файла, как упомянуто в PhpDOc

$zip->addFile('/path/to/index.txt', 'newname.txt');

И убедитесь, что вы получаете $file переменная с абсолютным путем. если вы загружаете файл из браузера, вы должны использовать $_FILE['file']['tmp_name'] в $zip->addFile метод по первому параметру

Другие вопросы по тегам