2015-06-16 87 views
2

我有一個名爲文件的文件夾,它包含多個文件。我想創建該文件夾的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;

一個ZIP文件被創建,但我的問題是,在壓縮文件中我想要的結果是文件夾但zip文件包含C-> xampp-> htdoc-> APP->根目錄 - > files-> pdf->文檔。請幫我

+0

請看這裏。 [創建一個zip文件,並下載] [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

警告: 下的foreach()提供參數無效:\ XAMPP \ htdocs中\暴躁\上線的index.php 11

解決方案

$ dir = $ _SERVER ['DOCUMENT_ROOT']。'/ files/pdf/docume NT';

驗證文件夾存在:/文件/ PDF /文件

和我說第二個參數:param - 文件名 $ zip-> addFile($ DIR '/' $文件。 $文件); CHANDAN PATTNAIK

- 如果文件夾包含多個文件的另一個子文件夾,則文件夾是無法得到ziped

$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; 

$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; 

您可以檢查此其實我犯了一個錯誤

我現在有這個解決方案

/** 
* 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