Заархивируйте папку и загрузите ее в бэкэнд Joomla

Я пытаюсь добавить опцию в пользовательский компонент Joomla 3.9, чтобы заархивировать некоторые PDF-файлы и загрузить их из бэкэнда. Я использовал это руководство. Я отредактировал файл defalt.php внутри /administrator/components/com_mycomponent/views/item/tmpl/ и добавил следующее:

<?php
if(isset($_POST['create'])){
$zip = new ZipArchive();
$filename = JPATH_ROOT . '/myfolder/myzipfile.zip';
if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
    exit("cannot open <$filename>\n");
}
$dir = JPATH_ROOT . '/myfolder/';
// Create zip
createZip($zip,$dir);
$zip->close();
}

// Create zip
function createZip($zip,$dir){
if (is_dir($dir)){
    if ($dh = opendir($dir)){
        while (($file = readdir($dh)) !== false){              
            // If file
            if (is_file($dir.$file)) {
                if($file != '' && $file != '.' && $file != '..'){                       
                    $zip->addFile($dir.$file);
                }
            }else{
                // If directory
                if(is_dir($dir.$file) ){
                    if($file != '' && $file != '.' && $file != '..'){
                        // Add empty directory
                        $zip->addEmptyDir($dir.$file);
                        $folder = $dir.$file.'/';                          
                        // Read data of the folder
                        createZip($zip,$folder);
                    }
                }      
            }         
        }
        closedir($dh);
    }
}
}

//Download Created Zip file
if(isset($_POST['download'])){   
$filename = JPATH_ROOT . '/myfolder/myzipfile.zip';
if (file_exists($filename)) {
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="'.basename($filename).'"');
    header('Content-Length: ' . filesize($filename));
    flush();
    readfile($filename);
    // delete file
    unlink($filename);
}
}
?>

ZIP-файл создается в правильном месте с правильным/ожидаемым размером, но он либо поврежден, либо пуст.

Я пробовал решения, найденные здесь в других сообщениях, но ничего не получилось.

Обновление: я открыл заархивированный файл с помощью 7-zip и обнаружил, что он содержит букву диска, на котором установлен xampp. Myzipfile.zip и все сжатые файлы находились в папке: G:/xampp/localhost/myjoomlasite/myfolder.

Нажатие на myzipfile.zip привело меня по тому же пути, что и петля. Замена JPATH_ROOT на JPATH_SITE дала те же результаты.

Я надеюсь, что кто-то может пролить свет на то, что здесь произошло.


person H Sanchez    schedule 16.07.2020    source источник
comment
Если вы ищете поддержку при разработке Joomla, у вас есть вопрос, который следует опубликовать на Joomla Stack Exchange.   -  person mickmackusa    schedule 19.07.2020


Ответы (1)


С помощью $zip->addFile($filename) вы добавляете файл с полным путем в zip-архив. Я предполагаю, что относительные пути - ваша цель? Итак, вам нужно будет сократить пути и использовать $zip->addFile($filename, $localFileName). Могут быть гораздо лучшие решения, самый простой способ — просто удалить базовый путь из $filename, чтобы получить $localFileName.

Вы также можете использовать RecursiveDirectoryIterator для циклического просмотра ваших файлов и каталогов.

Может быть, эта ссылка тоже поможет ?

person Sven Bluege    schedule 17.07.2020