2013-11-19 13 views
1

Только что я создал сценарий генерации zip, скрипт отлично работает при записи одного файла или двух трех файлов, но когда я пытаюсь загрузить весь каталог в zip, который содержит более 30 файлов, всего из 166MB, скрипты генерирует почтовый индекс в 2KB но проворная архив неизвестный формат или поврежденphp zip-ing файл с повреждением файла с несколькими файлами

<?php 
$error = ""; //error holder 

$post = $_POST; 
$file = $_GET['file']; 

//die($file); 
$file_folder = $_GET['file']; // folder to load files 
if(extension_loaded('zip')) 
{ 
// Checking ZIP extension is available 

// Checking files are selected 
$zip = new ZipArchive(); // Load zip library 
$zip_name = time().".zip"; // Zip name 


if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE) 
{ 
// Opening zip file to load files 
$error .= "* Sorry ZIP creation failed at this time"; 
} 

if (is_dir($file)) { 
    if ($dh = opendir($file)) { 
     while (($filename = readdir($dh)) !== false) { 
      if(!is_dir($file . $filename)){ 
       $zip->addFile($file . $filename); // Adding files into zip 

      } 
     } 
     closedir($dh); 
    } 
} else { 
    if(file_exists($file)){ 
     $zip->addFile($file); // Adding files into zip 
    } else { 
     $error = "* File not found"; 
    } 
} 
$zip->close(); 
if(file_exists($zip_name)) 
{ 
// push to download the zip 
header('Content-type: application/zip'); 
header('Content-Disposition: attachment; filename="'.$zip_name.'"'); 
readfile($zip_name); 
// remove zip file is exists in temp path 
unlink($zip_name); 
} 


} 
else 
$error .= "* You dont have ZIP extension"; 

if($error!=''){ 
    header("Location: index.php?cat=62&msg=Download currently not available, sorry for inconvenience."); 
} 
?> 

любая помощь будет оценена :)

ответ

0

Попробуйте это:

<?php 
$error = ""; //error holder 

$post = $_POST; 
$file = $_GET['file']; 

//die($file); 
$file_folder = $_GET['file']; // folder to load files 
if(extension_loaded('zip')) 
{ 
// Checking ZIP extension is available 

// Checking files are selected 
$zip = new ZipArchive(); // Load zip library 
$zip_name = time().".zip"; // Zip name 


if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE) 
{ 
// Opening zip file to load files 
$error .= "* Sorry ZIP creation failed at this time"; 
} 

if (is_dir($file)) { 
    if ($dh = opendir($file)) { 
     while (($filename = readdir($dh)) !== false) { 
      if(!is_dir($file . $filename)){ 
       $zip->addFile($file . $filename); // Adding files into zip 

      } 
     } 
     closedir($dh); 
    } 
} else { 
    if(file_exists($file)){ 
     $zip->addFile($file); // Adding files into zip 
    } else { 
     $error = "* File not found"; 
    } 
} 
$zip->close(); 
if(file_exists($zip_name)) 
{ 
    // push to download the zip 
    header('Content-type: application/zip'); 
    header('Content-Disposition: attachment; filename="'.$zip_name.'"'); 
    $zip_file = file_get_contents($zip_name); 
    print $zip_file; 
    // remove zip file is exists in temp path 
    unlink($zip_name); 
} 


} 
else 
$error .= "* You dont have ZIP extension"; 

if($error!=''){ 
    header("Location: index.php?cat=62&msg=Download currently not available, sorry for inconvenience."); 
} 
?> 

Что я замещается «ReadFile» с этим:

$zip_file = file_get_contents($zip_name); 
    print $zip_file; 

Я не знаю, что вызывает повреждение почтового индекса.

Надеюсь, это поможет.

+0

Спасибо, позвольте мне проверить, работает ли это: '( – justnajm

+0

Спасибо @Jey код работает сейчас, но что это такое, что он должен делать с ошибкой, я искал разницу b/w file_get_contents и readfile и readfile, похоже, имеют лучшие результаты, а затем file_get_contents. – justnajm

2

Надеюсь, это не жить на производственном сервере, как его довольно небезопасно, чтобы позволить кто-то установит путь к молнии, но если нет ...

Без отладки кода, попробуйте что-то вроде (обновлено обрабатывать размер файла по пределу ПГПС памяти)

<?php 
//set path 
$path = isset($_GET['file']) ? $_GET['file'] : null; 

//check exists 
if($path != null && file_exists($path)){ 
    //out zip name 
    $zip_out = time().".zip"; 
    //zip it or return error 
    if(Zippit::zipDir($path, $zip_out) === false){ 
     exit(header("Location: ./index.php?cat=62&msg=*+You+dont+have+ZIP+extension")); 
    } 

    // push to download the zip 
    header('Content-type: application/zip'); 
    header('Content-Disposition: attachment; filename="'.basename($zip_out).'"'); 
    header('Content-Length: '.sprintf("%u", filesize($zip_out))); 
    readfile($zip_out); 
    // remove zip file is exists in temp path 
    unlink($zip_out); 
    exit(); 
}else{ 
    exit(header("Location: ./index.php?cat=62&msg=*+File+not+Found")); 
} 

/** 
* Zippit 
* usage: Zippit::zipDir($path, $zip_out); 
*/ 
class Zippit { 
    /** 
    * Add files and sub-directories in a folder to zip file. 
    * @param string $folder 
    * @param ZipArchive $zipFile 
    * @param int $exclusiveLength Number of text to be exclusived from the file path. 
    */ 
    private static function folderToZip($folder, &$zipFile, $exclusiveLength) { 
     $handle = opendir($folder); 
     while (false !== $f = readdir($handle)) { 
      if ($f != '.' && $f != '..') { 
       $filePath = $folder."/".$f; 
       // Remove prefix from file path before add to zip. 
       $localPath = substr($filePath, $exclusiveLength); 
       if (is_file($filePath)) { 
        $zipFile->addFile($filePath, $localPath); 
       } elseif (is_dir($filePath)) { 
        // Add sub-directory. 
        $zipFile->addEmptyDir($localPath); 
        self::folderToZip($filePath, $zipFile, $exclusiveLength); 
       } 
      } 
     } 
     closedir($handle); 
    } 
    /** 
    * Zip a folder (include itself). 
    * Usage: 
    * Zippit::zipDir('/path/to/sourceDir', '/path/to/out.zip'); 
    * 
    * @param string $sourcePath Path of directory to be zip. 
    * @param string $outZipPath Path of output zip file. 
    */ 
    public static function zipDir($sourcePath, $outZipPath) 
    { 
     $pathInfo = pathInfo($sourcePath); 
     $parentPath = $pathInfo['dirname']; 
     $dirName = $pathInfo['basename']; 

     $z = new ZipArchive(); 
     if (!$z->open($outZipPath, ZIPARCHIVE::CREATE)) { 
      return false; 
     } 
     $z->addEmptyDir($dirName); 
     self::folderToZip($sourcePath, $z, strlen($parentPath."/")); 
     $z->close(); 
    } 
} 
?> 
+0

Спасибо @Lawrence, ваш код работает отлично для одного файла, но выбрасывает пустую страницу для mutliple (без создания zip-файла) – justnajm

+0

Ваша потребность в достаточном количестве памяти для обработки любых файлов, которые вы добавляете в zip, включить error_reporting –

+0

@justnajm проверить мои обновления ответ, надеюсь, что это помогает –

Смежные вопросы