2014-09-29 3 views
0

У меня есть проект о том, чтобы показать все файлы корневого каталога в списке, и пользователь может просматривать файлы-каталоги, искать файл по имени, с помощью кнопки downloadAll он может загружать все файлы в текущем списке. Чтобы заставить кнопку downloadAll работать, я использую код downloadAll.php, который, получив текущий каталог, может создать zip-файл и автоматически загрузить его. Он отлично работает в окнах. Я пытаюсь запустить тот же проект в linux, но в этом случае он загружает пустой файл в формате zip. Кроме того, когда я пытаюсь открыть его появляется следующее сообщение:php-код для zip-файла и автоматической загрузки файла. Работает на winones, но не в ubuntu

Archive: /tmp/archived_name.zip 
[/tmp/archived_name.zip] 
    End-of-central-directory signature not found. Either this file is not 
    a zipfile, or it constitutes one disk of a multi-part archive. In the 
    latter case the central directory and zipfile comment will be found on 
    the last disk(s) of this archive. 
zipinfo: cannot find zipfile directory in one of /tmp/archived_name.zip or 
      /tmp/archived_name.zip.zip, and cannot find /tmp/archived_name.zip.ZIP, period. 

Я пытаюсь найти, что не так в течение многих часов в настоящее время, но я не могу найти его. Если кто-то может мне помочь или получить какой-либо другой код, который я мог бы использовать, я бы очень хорошо знал.

downloadZip.php:

<?php 
if ((isset($_GET['currentdirectory'])) && ($_GET['currentdirectory']!="")){ 
    $the_folder = $_GET['currentdirectory']; 
} 
else { 
    $the_folder = "/var/www/my_project"; 
} 

    $the_folder1 = $the_folder; 

$zip_file_name = 'archived_name.zip'; 

$download_file= true; 


class FlxZipArchive extends ZipArchive { 


    public function addDir($location, $name) { 
     $this->addEmptyDir(str_replace("./","",$name)); 

     $this->addDirDo($location, str_replace("./","",$name)); 
    } 


    private function addDirDo($location, $name) { 
     $name .= '/'; 
     $location .= '/'; 


     $dir = opendir ($location); 
     while ($file = readdir($dir)) 
     { 
      if ($file == '.' || $file == '..') continue; 


      $do = (filetype($location . $file) == 'dir') ? 'addDir' : 'addFile'; 

       $this->$do($location . $file, str_replace("./","",$name) . $file); 

     } 
    } 
} 

$za = new FlxZipArchive; 
$res = $za->open($zip_file_name, ZipArchive::CREATE); 
if($res === TRUE) 
{ 
    $za->addDir($the_folder1, basename($the_folder1)); 
    $za->close(); 
} 
else { echo 'Could not create a zip archive';} 

if ($download_file) 
{ 
    ob_get_clean(); 
    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private", false); 
    header("Content-Type: application/zip"); 
    header("Content-Disposition: attachment; filename=" . basename($zip_file_name) . ";"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . filesize($zip_file_name)); 
    readfile($zip_file_name); 

} 
unlink("archived_name.zip"); 
?> 
+0

«пустой почтовый файл», вероятно, означает что-то другое для вас, чем я. Действительно ли файл пуст, как в нулевом байте? Или ваша zip-программа просто не может видеть файлы? Я предполагаю, что в zip-файле может быть выброшена ошибка php. Я предлагаю открыть zip-файл в текстовом редакторе и искать ошибку php. –

+0

Я открыл файл с помощью редактора txt и пуст. –

+2

Итак, у вас, вероятно, есть ошибка, которая происходит в другом месте. Попробуйте установить '$ download_file' в false и установите' error_reporting (E_ALL) ', чтобы увидеть, есть ли какие-либо ошибки. Если это не сработает, попробуйте просмотреть журналы ошибок веб-сервера. Для apache они по умолчанию «/ var/log/apache2/access.log» или аналогичные. –

ответ

1

Вы, вероятно, есть ошибка, что происходит в другом месте. Попробуйте установить $download_file на false и установите error_reporting(E_ALL), чтобы узнать, есть ли ошибки. Если это не сработает, попробуйте просмотреть журналы ошибок веб-сервера. Для apache они по умолчанию равны /var/log/apache2/error.log.