2012-07-01 69 views
0

,我有以下的zip下載功能:如何在不下載整個目錄路徑的情況下下載zip文件? (PHP)

$file='myStuff.zip'; 
function downloadZip($file){ 
    $file=$_SERVER["DOCUMENT_ROOT"].'/uploads/'.$file; 
    if (headers_sent()) { 
    echo 'HTTP header already sent'; 
    } 
     else { 
     if (!is_file($file)) { 
      header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
      echo 'File not found'; 
     } else if (!is_readable($file)) { 
      header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
      echo 'File not readable'; 
     } else { 
      header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
      header("Content-Type: application/zip"); 
      header("Content-Transfer-Encoding: Binary"); 
      header("Content-Length: ".filesize($file)); 
      header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
      readfile($file); 
      exit; 
     } 
    } 
} 

問題是,當我調用這個函數,我結束了下載不只是myStuff.zip,但所有的文件夾的完整目錄路徑。我在Mac上使用XAMPP所以這意味着我得到如下:

/applications/xampp/htdocs/uploads/myStuff.zip 

這意味着我得到一個文件夾,名爲應用程序與所有子文件夾,然後裏面所有的人,我得到myStuff.zip。

如何我剛剛下載myStuff.zip沒有它的目錄?

+0

我猜它是與['基名()'](http://php.net/manual/en/function.basename.php)。 –

+0

擺脫基本名稱的'()'只是重新添加路徑信息,以下載ZIP –

+0

的名字你爲什麼不只是保留從一開始'$ file'? –

回答

0

好吧,我回答我自己的問題,通過使用這個鏈接代碼:http://www.travisberry.com/2010/09/use-php-to-zip-folders-for-download/

這裏的PHP:

<?php 
//Get the directory to zip 
$filename_no_ext= $_GET['directtozip']; 

// we deliver a zip file 
header("Content-Type: archive/zip"); 

// filename for the browser to save the zip file 
header("Content-Disposition: attachment; filename=$filename_no_ext".".zip"); 

// get a tmp name for the .zip 
$tmp_zip = tempnam ("tmp", "tempname") . ".zip"; 

//change directory so the zip file doesnt have a tree structure in it. 
chdir('user_uploads/'.$_GET['directtozip']); 

// zip the stuff (dir and all in there) into the tmp_zip file 
exec('zip '.$tmp_zip.' *'); 

// calc the length of the zip. it is needed for the progress bar of the browser 
$filesize = filesize($tmp_zip); 
header("Content-Length: $filesize"); 

// deliver the zip file 
$fp = fopen("$tmp_zip","r"); 
echo fpassthru($fp); 

// clean up the tmp zip file 
unlink($tmp_zip); 
?> 

和HTML:

<a href="zip_folders.php?directtozip=THE USERS DIRECTORY">Download All As Zip</a> 

的擺脫目錄結構的關鍵步驟似乎是chdir()。還值得注意的是,這個答案中的腳本使得zip文件在運行中而不是像我在我的問題中那樣嘗試檢索先前的壓縮文件。

1

試試這個。

readfile(basename($file)); 
+0

- 。@ circusrob,由於現在當我點擊下載的文件,它會打開一個'myStuff.zip.cpgz'文件,意思是它不顯示myStuff的內容,看起來更靠近右邊,但是還是有些問題...... –

+0

你需要清理緩衝區並在讀取之前刷新緩衝區,例如''' ob_clean(); flush(); readfile(basename($ file)); exit;' –

+0

並沒有影響結果,仍然像剛剛擁有'readfile(basename($ file));' –