yii框架裏實現文件下載,及多文件壓縮包下載
開發中,經常會用到下載文件,對文件下載需要以壓縮包的形式下載下來,單文件下載有時候遇到圖片或txt文件時,瀏覽器會直接輸出,而不是以文件的形式下載,今天的例子適用於圖片、txt文件、其他文件均已文件的形式下載:
代碼實例,例如:
#單文件下載文件
#文件絕對地址
$filePath= 'https://www.test.com/file/測試.txt';
#獲取文件名 測試.txt
$saveAsFileName = end(explode('/',$filePath));
#這裏獲取文件名,不可用pathinfo()函數,basename雖然一般在本地可以正常獲取,但是提交阿里服務器時,有時會出現獲取不到,獲取不完整的情況,我遇到的是隻獲取到了後綴,文件名缺失
public function downloadFile($filePath, $saveAsFileName)
{
$filename = $filePath;
$saveAsFileName = iconv('utf8', 'gbk', $saveAsFileName);
$file = fopen($filename, "rb");
Header("Content-type: application/octet-stream ");
Header("Accept-Ranges: bytes ");
Header("Content-Disposition: attachment; filename= {$saveAsFileName}");
$contents = "";
while (!feof($file)) {
$contents .= fread($file, 8192);
}
echo $contents;
fclose($file);
}
#多文件以壓縮包的形式下載
public function downLoadFiles(){
$filePath = [
'https://www.test.com/file/小草.jpg',
'https://www.test.com/file/測試.txt',
'https://www.test.com/file/通關考試.doc',
'https://www.test.com/file/答案.docx',
];
$tmpFile = tempnam('/tmp', '');
$zip = new ZipArchive;
$zip->open($tmpFile, ZipArchive::CREATE);
foreach ($files as $file) {
// download file
$fileContent = file_get_contents($file);
$file = iconv('utf-8', 'GBK', basename($file));
$zip->addFromString($file, $fileContent);
}
$zip->close();
header('Content-Type: application/zip;charset=utf8');
header('Content-disposition: attachment; filename=附件' . date('Y-m-d') . '.zip');
header('Content-Length: ' . filesize($tmpFile));
readfile($tmpFile);
unlink($tmpFile);
}