2015-06-16 1 views
2

У меня есть папка с именем document и она содержит несколько файлов. Я хочу создать zip этой папки и загрузить ее на лету. Ниже мой код
создать zip-файл из папки и загрузить ее с помощью php

   $dir = WWW_ROOT.'/files/pdf/document';
$archive = 'MyDocument.zip';

$zip = new ZipArchive; $zip->open($archive, ZipArchive::CREATE); $files = scandir($dir); unset($files[0], $files[1]); foreach ($files as $file) { $zip->addFile($dir.'/'.$file); } $zip->close(); header('Content-Type: application/zip'); header('Content-disposition: attachment; filename='.$archive); header('Content-Length: '.filesize($archive)); readfile($archive); unlink($archive);exit;

файл зип получает создан, но моя проблема заключается в почтовом файле моего желаемый результат папки документа но почтовый файл содержит C-> xampp-> htdoc-> app-> Webroot -> files-> pdf-> document. Пожалуйста, помогите мне

+0

См. Здесь. [Создать почтовый файл и загрузить его] [1] [1]: http://stackoverflow.com/a/12226067/3758705 –

ответ

0

Уведомления и предупреждение

Примечания: Использования неопределенной константы WWW_ROOT - предполагаемая 'WWW_ROOT' в C: \ XAMPP \ HTDOCS \ вспыльчивого \ index.php в строке 2

Предупреждение: ScanDir (WWW_ROOT/файлы/PDF/документ, WWW_ROOT/файлы/PDF/документ): в C: \ XAMPP \ HTDOCS \ вспыльчивым \ index.php в строке 9

Предупреждение: ScanDir (WWW_ROOT/файлы/PDF/доку): не удалось открыть директорию: такой файл или каталог в C: \ xampp \ htdocs \ testy \ index.php в строке 9

Предупреждение: scandir(): (errno 2): Нет такого файла или каталога в C: \ XAMPP \ HTDOCS \ вспыльчивого \ index.php в строке 9

Внимание: Недействительный аргумент для Еогеаспа() в C: \ XAMPP \ HTDOCS \ вспыльчивый \ index.php в строке 11

решения

$ реж = $ _SERVER [ 'DOCUMENT_ROOT']. '/ файлы/PDF/DOCUME нт ';

и

Убедитесь, что папка существует:./Файлы/PDF/документ

и я добавил вторые пары - имя файла $ zip-> AddFile ($ реж '/' $ файл. $ файла);

$dir = $_SERVER['DOCUMENT_ROOT'].'/files/pdf/document'; 
$archive = 'MyDocument.zip'; 


$zip = new ZipArchive; 
$zip->open($archive, ZipArchive::CREATE); 
$files = scandir($dir); 
unset($files[0], $files[1]); 
foreach ($files as $file) { 
$zip->addFile($dir.'/'.$file, $file); 
} 
$zip->close(); 
header('Content-Type: application/zip'); 
header('Content-disposition: attachment; filename='.$archive); 
header('Content-Length: '.filesize($archive)); 
readfile($archive); 
unlink($archive);exit; 

Вы можете проверить это:

$dir = $_SERVER['DOCUMENT_ROOT'].'/files/pdf/document'; 
$archive = 'MyDocument.zip'; 


$zip = new ZipArchive; 
$zip->open($archive, ZipArchive::CREATE); 
$files = scandir($dir); 
unset($files[0], $files[1]); 
foreach ($files as $file) { 
$zip->addFile($dir.'/'.$file, $file); 
} 
print_r('<pre>'); 
print_r($dir);//path 
print_r($files);//files 
print_r($zip);//object zip 
die; 

$zip->close(); 
header('Content-Type: application/zip'); 
header('Content-disposition: attachment; filename='.$archive); 
header('Content-Length: '.filesize($archive)); 
readfile($archive); 
unlink($archive);exit; 

если папка документ содержит другую подпапку с несколькими файлами, то папка документ не смог ziped - Chandan PATTNAIK

фактически я сделал ошибку

У меня теперь есть решение этого вопроса

/** 
* Created by websky 
*/ 
class myZipper extends ZipArchive{ 
    protected $dir; 
    protected $archive; 
    protected $pathsArray; 

    /** 
    * @param string $dir 
    * @param string $name 
    */ 
    public function __construct($dir,$name){ 
     $this->dir = $dir; 
     $this->archive = $name; 
     $this->open($this->archive, myZipper::CREATE); 
     $this->myScanDir($this->dir); 
     $this->addZip(); 
     $this->getZip(); 
    } 

    /** 
    * @param string $dir 
    */ 
    protected function myScanDir($dir){ 
     $files = scandir($dir); 
     unset($files[0], $files[1]); 
     foreach ($files as $file) { 
      if(is_dir($dir.'/'.$file)){ 
       $this->myScanDir($dir.'/'.$file); 
      } 
     else { 
       $this->pathsArray[] = array('oldpath' => $dir.'/'.$file, 'newpath'=> (($this->dir == $dir)? $file : str_replace($this->dir.'/', '', $dir).'/'.$file)); 
      } 
     } 
    } 

    protected function addZip(){ 
     foreach($this->pathsArray as $path){ 
      $this->addFile($path['oldpath'],$path['newpath']); 
     } 
    } 

    public function getZip(){ 
     $this->close(); 
     header('Content-Type: application/zip'); 
     header('Content-disposition: attachment; filename='.$this->archive); 
     header('Content-Length: '.filesize($this->archive)); 
     readfile($this->archive); 
     unlink($this->archive); 
    } 
    } 

    $test = new myZipper($_SERVER['DOCUMENT_ROOT'].'/files/pdf/document', 'MyDocument.zip'); 
+0

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

+0

, и если папка документа содержит другую подпапку с несколькими файлами, тогда папка документа не может получить ziped –

+0

Да, вы правы. Надеюсь, теперь это сработает. Для моего теста это нормально – websky

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