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文件并实现下载?(附代码实例)

}

// 关闭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类,我们可以轻松实现将多个文件打包成一个压缩包供用户下载的功能。希望这篇文章能对你有所帮助!