Laravel如何创建Zip文件并实现下载?(附代码实例)
有时需要将多个文件打包成一个压缩包供用户下载,这时我们可以使用PHP内置的ZipArchive类来实现。下面就介绍一下如何在Laravel中创建Zip文件并实现下载:
在Web开发中,有时需要将多个文件打包成一个压缩包供用户下载,这时我们可以使用PHP内置的ZipArchive类来实现。而对于Laravel框架的开发者来说,更方便的做法是使用Laravel自带的Filesystem类和Response类来完成这个任务。
下面就介绍一下如何在Laravel中创建Zip文件并实现下载:
1. 创建一个路由
首先,在routes/web.php文件中创建一个路由:
“`php
Route::get(‘/download’, ‘DownloadController@download’);
“`
2. 创建控制器
然后,在控制器app/Http/Controllers/DownloadController.php中编写代码:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesFile;
use IlluminateSupportFacadesResponse;
use ZipArchive;
class DownloadController extends Controller
{
public function download()
{
// 要打包成Zip的文件路径数组
$filePaths = [
public_path(‘files/file1.txt’),
public_path(‘files/file2.txt’),
public_path(‘files/file3.txt’)
];
// 创建ZipArchive对象
$zip = new ZipArchive();
// 生成临时文件名,并将其保存到storage/app/temp目录下
$tempFileName = tempnam(storage_path(‘app/temp’), ‘zip_’);
// 打开临时文件,并向其中添加要打包的所有文件
if ($zip->open($tempFileName, ZipArchive::CREATE) === TRUE) {
foreach ($filePaths as $filePath) {
// 获取文件名
$fileName = basename($filePath);
// 向ZipArchive对象中添加文件
$zip->addFile($filePath, $fileName);
![Laravel如何创建Zip文件并实现下载?(附代码实例)缩略图 Laravel如何创建Zip文件并实现下载?(附代码实例)](https://www.72715.net/wp-content/uploads/2023/05/130e86f9622e8457f2c9e1c700ba3f33.png)
}
// 关闭ZipArchive对象
$zip->close();
}
// 将临时文件作为响应返回,并设置Content-Type和Content-Disposition头信息
return Response::download(
$tempFileName,
‘files.zip’,
[‘Content-Type’ => ‘application/zip’, ‘Content-Disposition’ => ‘attachment’]
);
}
}
在上述代码中,我们首先定义了要打包成Zip的文件路径数组$filePaths,然后创建了一个ZipArchive对象$zip。接着,我们生成了一个临时文件名并将其保存到storage/app/temp目录下,并通过$zip->open()方法将该临时文件打开。随后,我们利用foreach循环向$zip对象中添加要打包的所有文件。
最后,在响应中使用Response::download()方法将临时文件作为响应返回给用户,并设置Content-Type和Content-Disposition头信息。其中,第二个参数表示下载下来的压缩包名称为files.zip。
3. 创建测试用例
最后,在tests/Feature/DownloadTest.php中编写测试用例:
namespace TestsFeature;
use IlluminateFoundationTestingRefreshDatabase;
use IlluminateFoundationTestingWithFaker;
use IlluminateHttpResponse;
use TestsTestCase;
class DownloadTest extends TestCase
public function test_download_zip_file()
$response = $this->get(‘/download’);
// 断言响应状态码为200
$response->assertStatus(Response::HTTP_OK);
// 断言响应头信息中包含Content-Type和Content-Disposition
$response->assertHeader(‘Content-Type’, ‘application/zip’);
$response->assertHeader(‘Content-Disposition’, ‘attachment; filename=files.zip’);
// 删除临时文件
unlink($response->getFile()->getPathname());
在测试用例中,我们利用$this->get()方法向/download路由发送一个GET请求,并断言返回的响应状态码为200。接着,我们断言响应头信息中包含Content-Type和Content-Disposition。最后,我们通过unlink()函数删除生成的临时文件。
现在,运行php artisan test命令即可执行该测试用例。
总结
通过使用Laravel自带的Filesystem类和Response类以及PHP内置的ZipArchive类,我们可以轻松实现将多个文件打包成一个压缩包供用户下载的功能。希望这篇文章能对你有所帮助!