标签分类
技术文章
当前位置:主页 > 计算机编程 > php > Laravel 中创建 Zip 压缩文件并提供下载的实现方法

Laravel创建Zip压缩文件下载的实例方法

  • 发布时间:
  • 作者:码农之家原创
  • 点击:99

Laravel 中创建 Zip 压缩文件并提供下载的实现方法

这篇文章主要知识点是关于laravel,zip,压缩文件,laravel,下载,Laravel 中创建 Zip 压缩文件并提供下载的实现方法,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

PHP7从入门到精通:教学版
  • 类型:PHP7大小:426 MB格式:PDF出版:清华大学出版社作者:刘增杰、张工厂
立即下载

如果您需要您的用户支持多文件下载的话,最好的办法是创建一个压缩包并提供下载。下面通过本文给大家看下在 Laravel 中的实现。

事实上,这不是关于 Laravel 的,而是和 PHP 的关联更多,我们准备使用从 PHP 5.2 以来就存在的 ZipArchive 类 ,如果要使用,需要确保php.ini 中的 ext-zip 扩展开启。

任务 1: 存储用户的发票文件到 storage/invoices/aaa001.pdf

下面是代码展示:

$zip_file = 'invoices.zip'; // 要下载的压缩包的名称
// 初始化 PHP 类
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$invoice_file = 'invoices/aaa001.pdf';
// 添加文件:第二个参数是待压缩文件在压缩包中的路径
// 所以,它将在 ZIP 中创建另一个名为 "storage/" 的路径,并把文件放入目录。
$zip->addFile(storage_path($invoice_file), $invoice_file);
$zip->close();
// 我们将会在文件下载后立刻把文件返回原样
return response()->download($zip_file);

例子很简单,对吗?

*

任务 2: 压缩 全部 文件到 storage/invoices 目录中

Laravel 方面不需要有任何改变,我们只需要添加一些简单的 PHP 代码来迭代这些文件。

$zip_file = 'invoices.zip';
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);

$path = storage_path('invoices');
$files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
foreach ($files as $name => $file)
{
 // 我们要跳过所有子目录
 if (!$file->isDir()) {
  $filePath  = $file->getRealPath();

  // 用 substr/strlen 获取文件扩展名
  $relativePath = 'invoices/' . substr($filePath, strlen($path) + 1);

  $zip->addFile($filePath, $relativePath);
 }
}
$zip->close();
return response()->download($zip_file);

到这里基本就算完成了。你看,你不需要任何 Laravel 的扩展包来实现这个压缩方式。

PS:下面看下laravel从入门到精通之 文件处理 压缩/解压zip

1:将此软件包添加到所需软件包列表中composer.json

"chumper/zipper": "1.0.x"

2:命令行执行

composer update

3:配置app/config/app.php

add to providers Chumper\Zipper\ZipperServiceProvider::class
add to aliases 'Zipper' => Chumper\Zipper\Zipper::class

4:遍历文件打包至压缩包

$files = Array();
    foreach ($student as $key => $data) {
      if ($data->photopath != null) {
        $check = glob(storage_path('photo/' . $data->photopath));
        $files = array_merge($files, $check);
      }
    }
 Zipper::make(storage_path() . '/systemImg/' . $name)->add($files)->close();

5:读取压缩包文件

  Zipper::make( storage_path() . '/photo/photos')->extractTo(storage_path('temp'));
 $zip = new \ZipArchive();//方法2:流处理,新建一个ZipArchive的对象
        $logFiles = Zipper::make($path)->listFiles('/\.png$/i');
        if ($zip->open($path) === TRUE) {
          foreach ($logFiles as $key) {
            $stream = $zip->getStream($key);
            $str = stream_get_contents($stream); //这里注意获取到的文本编码
            $name = iconv("utf-8", "gb2312//IGNORE", $key);
            file_put_contents(storage_path() . '\temp\\' . $name, $str);
          }
        } else {
          return '{"statusCode":"300", "message":"上传失败,请检查照片"}';
        }

总结

以上所述是小编给大家介绍的Laravel 中创建 Zip 压缩文件并提供下载的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到vue项目中使用md5加密以及、 解决axios.interceptors.respon、 spring+springmvc+mybatis整合注、 等php文章进一步学习,感谢大家的阅读和支持。

上一篇:ThinkPHP的SAE开发相关知识点总结

下一篇:如何实现Laravel的服务容器的实例方法

展开 +

收起 -

学习笔记
网友NO.155645

通过修改Laravel Auth使用salt和password进行认证用户详解

前言 本文主要给大家介绍了通过修改Laravel Auth用salt和password进行认证用户的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: Laraval自带的用户认证系统Auth非常强大易用,不过在Laravel的用户认证系统中用户注册、登录、找回密码这些模块中用到密码加密和认证算法时使用的都是bcrypt,而很多之前做的项目用户表里都是采用存储salt + password加密字符串的方式来记录用户的密码的,这就给使用Laravel框架来重构之前的项目带来了很大的阻力,不过最近自己通过在网上找资料、看社区论坛、看源码等方式完成了对Laravel Auth的修改,在这里分享出来希望能对其他人有所帮助。 开篇之前需要再说明下如果是新项目应用Laravel框架,那么不需要对Auth进行任何修改,默认的bcrypt加密算法是比salt + password更安全更高效的加密算法。 修改用户注册 首先,在laravel 里启用验证是用的artisan命令 php artisan make:auth 执行完命令后在routes文件(位置:app/Http/routes.php)会多一条静态方法调用 Route::auth(); 这个Route是Laravel的一个Facade (位于Illuminate\Support\Facades\Route), 调用的auth方法定义在Illuminate\Routing\Router类里, 如下可以看到auth方法里就是定义了一些Auth相关的路由规则 /** * Register the typical authentication routes for an application. * * ……

网友NO.268420

Laravel框架实现多数据库连接操作详解

本文实例讲述了Laravel框架实现多数据库连接操作。分享给大家供大家参考,具体如下: 这篇文章介绍了在laravel中连接2个数据库的方法 一、定义连接 进入到数据库配置文件 app/config/database.php 中,你可以定义多个形式相同或不同的数据库连接。例如,你想从2个 MYSQL 数据中抓取资料到你的程式中,你可以这样定义: ?phpreturn array( 'default' = 'mysql', 'connections' = array( # Our primary database connection 'mysql' = array( 'driver' = 'mysql', 'host' = 'host1', 'database' = 'database1', 'username' = 'user1', 'password' = 'pass1' 'charset' = 'utf8', 'collation' = 'utf8_unicode_ci', 'prefix' = '', ), # Our secondary database connection 'mysql2' = array( 'driver' = 'mysql', 'host' = 'host2', 'database' = 'database2', 'username' = 'user2', 'password' = 'pass2' 'charset' = 'utf8', 'collation' = 'utf8_unicode_ci', 'prefix' = '', ), ),); 默认连接任然是mysql,除非指定其他连接,如mysql2,我们的连接都是mysql连接。 2、指定连接 现在我们来指定mysql2连接,怎么做呢: Schema 数据库迁移 用 Schema facade 可以创建任意连接。现在只需要用 connection() 方法就可以在指定的数据库中创建table Schema::connection('mysql2')-create('some_table', function($table){ $table-increments('id'):}); 如果不加 connection() 方法,就是在默认的数据库中创建table 查询 和上面一样,用 connection() 方法 $users =……

网友NO.258505

Laravel5.4框架使用socialite实现github登录的方法

本文实例讲述了Laravel5.4框架使用socialite实现github登录的方法。分享给大家供大家参考,具体如下: 1.安装laravel5.4 composer create-project laravel/laravel zcms 5.4 2.安装Socialite composer require laravel/socialite 3.配置 编辑config/app.php 'providers' = [ // 其它服务提供者... Laravel\Socialite\SocialiteServiceProvider::class,], 'aliases' = [ 'Socialite' = Laravel\Socialite\Facades\Socialite::class,] 编辑config/service.php 'github' = [ 'client_id' = env('GITHUB_CLIENT_ID'), 'client_secret' = env('GITHUB_CLIENT_SECRET'), 'redirect' = env('GITHUB_REDIRECT'),], 4.申请github oauth apps ①.登录github-settings-OAuth Apps ②.填写Homepage URL(网站域名 http://www.zcms.site ),Authorization callback URL(回调路径 http://www.zcms.site/github/login ) ③.复制client_id,client_secret到.env文件 GITHUB_CLIENT_ID=211a7aa4b9c5a3a4c10c GITHUB_CLIENT_SECRET=2d3174561e440ed887a604f571aff9fa5bd84e44 GITHUB_REDIRECT=http://www.zcms.site/github/login 5.使用 ①.添加路由 Route::get('/login', 'LoginController@github');Route::get('/github.login', 'LoginController@githubLogin'); //这里为刚才的回调路径 ②.创建Controller App\Http\Controllers创建LoginController.php ?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Socialite;class LoginController extends Controller{ public function github() { return Socialite::driver('github')-redirect(); } public function githubLogin() { $user = Soci……

网友NO.801531

Laravel框架中VerifyCsrfToken报错问题的解决

前言 本文主要给大家介绍了关于Laravel框架中VerifyCsrfToken报错问题的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 报错情况 form 表单进行 post 方式提交数据时,遇到如下的报错情况. TokenMismatchException in VerifyCsrfToken.php line 67:in VerifyCsrfToken.php line 67at VerifyCsrfToken-handle(object(Request), object(Closure)) post 数据提交报错 原因 Laravel 推荐在全局注册 VerifyCsrfToken 的 Middleware ,对所有 Post,Put,Delete 请求自动校验是否带合法的 _csrf token。 解决方法 方法 1.在form表单中添加如下的隐藏域代码 input type="hidden" name="_token" value="{{ csrf_token() }}" / 方法 2.在form表单中添加 csrf_field (与上述解决方法功能一致) {!! csrf_field() !!} 方法 3.注释 Kernel.php 代码 打开 app\Http\Kernel.php,在文件中注释掉下面的代码 \App\Http\Middleware\VerifyCsrfToken::class 方法 4. 修改handle()方法 打开 \app\Http\Middleware\VerifyCsrfToken.php,添加或修改 handle()方法如下: public function handle($request, \Closure $next) { // 使用CSRF //return parent::handle($request, $next); // 禁用CSRF return $next($request); } 补充 csrf 介绍 csrf 图解释义 参考文章 1. Laravel 5.3 文档 - CSRF攻击原理及其防护 2. Laravel 5.3 文档 - HTTP层 CSRF保护 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明