php壓縮多個文件打包成zip并下載到本地

完成時間:2018-01-03

展現方式:整個相冊圖片的導出(下載到本地)直接在頁面上生成下載沒有什么另存為什么默認路徑

基本步驟:

1.用戶點擊按鈕跳轉到對應相冊導出的方法

---->2.在方法中通過頁面的相冊id號進行數據庫查找對應相冊的每個圖片路徑

---->3.記錄保存到數組中

---->4.后續把圖片打包進壓縮文件直接把數組的路徑鍵讀取壓縮進即可.

遇到的坑:

A.如何解決在服務器生成一次壓縮包.zip文件之后每次通過文件名查找文件是否存在存在就返回文件.

1.嘗試用相冊id號查找相冊名,以相冊名.zip為生成的文件名.在有中文字符的前提,生成的壓縮文件會出錯(格式之類的問題).在網上查找解決方案如下:用(純英文不算)iconv("utf-8","gb2312",$path );

照樣出錯,不存在編碼什么的轉換一下就ok的問題,當然我放棄了他. X

2.利用時間戳來生成文件名(時間不含有中文,只有數字,而且唯一性可判斷),仔細想想你每次都會根據當前時間生成一個新的文件.所以我就想解決辦法,可否通過生成一個靜態變量或者靜態數組第一次生成該相冊的壓縮包時把該相冊的id為數組鍵,第一次的文件名為鍵值.形式如下$s1[$相冊id]=$filename;//$filename=第一次生成的壓縮包文件名.之后每次執行導出相冊的時候則通過判斷是否存在這個相冊id的$filename來進行.如果存在這個相冊鍵值則返回這個文件名為導出相冊.當然我沒有嘗試這個靜態數組的方式去寫,因為我不明確怎么去聲明,在哪里聲明這個靜態變量.這個方法交給有心人去嘗試了.我還想到了一種需要數據庫的操作,就是你可以在對應的相冊上加一個字段為打包相冊的文件名當然不能含有中文,你可以每次導出的時候查詢這個字段就可以了. :)?

A.√解決辦法:

通過對應的相冊id查到唯一的相冊名(所有類型的字符中文,數字等都可以)保存下來通過md5轉換他這樣他就是不含有中文的文件名并且唯一:)

形式如下:$s1=md5($s1);

B.再說一個小坑:當你都沒有問題后你下載打包的壓縮文件時你會發現你的zip有時候下載的文件大小為0字節,:D就根本沒下下來好嘛!但是你會發現小的壓縮文件還是可以下下來的比如十幾二十MB的,這里就是要設置php配置文件了。

B.√解決辦法:php.ini:memory_limit 主要是解決readfile() 函數進行的文件下載大小設置。

memory_limit = XXXM (1024M 512M)等等看你喜歡

接下來上代碼:

/** 導出相冊*/

$extra->append(array(

? ? ? ? '<? a class="btn btn_primary add upload-image"? target="_blank" href="?m=photo&a=exportAlbum&albumid='.$albumId.'" style="color:white;position: relative"> 導出相冊< /a? >',

));//$albumId=代表對應相冊id,a=exportAlbum跳轉導出相冊這個方法

public static function exportAlbum(){

? ? error_reporting(E_ALL^E_NOTICE);

? ? $albumId = Safe::number(request('albumid'), '相冊ID', false);

? ? $rs = System::$pdo->prepare("SELECT `img` FROM `photo` WHERE `albumid`=$albumId");

? ? $rs->execute();

? ? $data = $rs->fetchAll(PDO::FETCH_ASSOC);

? ? $rs1 = System::$pdo->prepare("SELECT `name` FROM `album` WHERE `id`=$albumId");

? ? $rs1->execute();

? ? $data1 = $rs1->fetchAll(PDO::FETCH_ASSOC);

? ? $s1=$data1[0][name];

? ? $s1=md5($s1);

? ? $filename ="$s1.zip"; //最終生成的文件名(含路徑)

? ? if(!file_exists($filename) ){

? ? ? ? $zip = new ZipArchive();

? ? ? ? if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {

? ? ? ? ? ? exit('無法打開文件,或者文件創建失敗');

}

? ? ? ? foreach( $data as $key=>$val){

? ? ? ? ? ? if(file_exists($val[img])){

? ? ? ? ? ? ? $zip->addFile( $val[img], basename($val[img]));

? ? ? ? ? ? }

}

? ? ? ? $zip->close();//關閉

? ? }

? ? if(!file_exists($filename)){

? ? ? ? ? ? exit("無法找到文件");

}

? ? header("Cache-Control: public");

? ? header("Content-Description: File Transfer");

? ? header('Content-disposition: attachment; filename='.basename($filename)); //文件名

? ? header("Content-Type: application/zip"); //zip格式的

? ? header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進制文件

? ? header('Content-Length: '.filesize($filename)); //告訴瀏覽器,文件大小

? ? @readfile($filename);

? ? exit;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。