PHP 文件上传七牛云

时间:2022-08-23 15:01:01

PHP

  之Laravel 使用qiniu/php-sdk, itbdw/laravel-storage-qiniu, 组件上传文件到七牛云.

 

一.  序言

 

这几天在laravel 框架上使用qiniu,  发现这类教程有些少, 所以就把自己的经验写下来, 以供大家参考一下.

在这里有两个组件可以使用, 一个是PHP 通用的qiniu/php-sdk, 只要使用PHP,就可以使用的通用组件,

而itbdw/laravel-storage-qiniu, 是其作者根据laravel 的特性优化qiniu/php-sdk 组件从而方便在laravel 上使用的文件上传组件. 感谢他们!

 

二.  前文

 

环境: php:7.0.12, laravel.

 

1) 首先, 建立一个小模块.

 

a) 链接地址

admin/test/fileupload

 

b) 路由

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {

  Route::get('test/fileupload', "TestController@fileUpload");

  Route::post('test/upload', "TestController@upload");

});

 

c) 控制器展现视图

  TestController/fileUpload

 

d) 视图

admin/test/fileupload

 

  视图只需要一个表单, 加上input:file, 即可.

 

Tip: 要想上传文件, 须在更改form 表单编码, 这里介绍enctype. 文件上传时必须使用multipart/form-data.

<form action="{{url('admin/test/upload')}}" method="post" enctype="multipart/form-data">

 PHP 文件上传七牛云

PHP 文件上传七牛云

 

 

 

 

. enctype: 规定在发送表单数据之前如何对其进行编码。有三种设置类型

默认为application/x-www-form-urlencoded:发送前编码所有字符

. multipart/form-data:不对字符编码,包含文件上传控件的表单时,必须使用该值

. text/plain:空格转换为 "+" 加号,但不对特殊字符编码。

 

e) 处理.

 

在这里选一张图片点击上传, form 表单提交到TestController/upload 控制器. dd 打印一下.

 

 PHP 文件上传七牛云

PHP 文件上传七牛云

 

 

 

  看到上传文件信息, 现在开始上传七牛云操作.

 

三. 安装

 

1) composer 下载qiniu/php-sdk, itbdw/laravel-storage-qiniu 两个组件.

 

这两个组件都可以在https://packagist.org/ 上搜到. 其实各个组件也都自带教程, 只是不针对.

 

2) 打开命令行cd 到laravel 文件夹下

 

cd ../laravel

(这里cd 你自己的地址)

 

3) 安装itbdw/laravel-storage-qiniu, qiniu/php-sdk

 

composer require itbdw/laravel-storage-qiniu

 

Tip: 这时候安装过程会出现一个错误.

 PHP 文件上传七牛云

 

 

doctrine / instantiator的安装请求(锁定在1.1.0) - >由doctrine / instantiator可以满足[1.1.0], 这个组件需要PHP ^7.1 版本, 所以我的版本不满足要求. 这时候安装doctrine/instantiator 即可, 在Packagist 上也能搜到, 作用是: 用于在不调用构造函数的情况下实例化PHP中的对象.

 

composer require doctrine/instantiator

 PHP 文件上传七牛云

 

  会发现他给你倒退版本. 这时候再次安装itbdw/laravel-storage-qiniu 组件即可.

 

composer require itbdw/laravel-storage-qiniu

 PHP 文件上传七牛云

 

  安装成功后, 会自动安装qiniu/php-sdk, 发现laravel/vendor 下有了itbdw, qiniu 两个文件夹.

 PHP 文件上传七牛云

 

 

四. 使用

 

a) itbdw/laravel-storage-qiniu

 

1. 在config/app.php里面的providers数组,加上一行

itbdw\QiniuStorage\QiniuFilesystemServiceProvider::class,

 PHP 文件上传七牛云

 

Tip: 这就相当于注册中间件一样, 告诉框架, 我在提供方里注册了一个新组件.

 

2. config/filesystem.php的里面disks数组加上:

 

'disks' => [

 

        // 如果有多个 bucket,增加类似配置即可

        'qiniu' => [

            'driver' => 'qiniu',

            'domain' => 'https://www.example.com',   //你的七牛域名,支持 http 和 https,也可以不带协议,默认 http

            'access_key' => '',                       //AccessKey

            'secret_key' => '',                       //SecretKey

            'bucket'     => '',                      //Bucket名字

        ],

       

        'qiniu_private' => [

            'driver' => 'qiniu',

            'domain' => 'https://www.example.com',    //你的七牛域名,支持 http 和 https,也可以不带协议,默认 http

            'access_key'    => '',                         //AccessKey

            'secret_key' => '',                            //SecretKey

            'bucket' => 'qiniu_private',                 //Bucket名字

        ],

       

        ...

],

 

Tip: disks 数组里面有两个数组, 看名字也知道, 一个为正常情况下使用, 一个是私有的. 我只添加了一个通用的, 也就是第一个, 若有要保密的, 可用第二个.

 

. 在这里讲讲这几个参数.

 

'driver'  # 就不讲了, 默认qiniu

 

'domain' => 'https://www.example.com',  

// 你的七牛域名,(支持 http 和 https,也可以不带协议,默认 http)

 PHP 文件上传七牛云

 

'access_key'   # 公钥

'secret_key'   # 密钥

 

 PHP 文件上传七牛云

 

'bucket'     # bucket 就是你空间的名字

 PHP 文件上传七牛云

  

3. itbdw/laravel-storage-qiniu 的使用不用引入命名空间, 直接使用. 其readme 中也有介绍方法, 两种, 但是可以结合用.

 

代码:

$disk     = \Storage::disk('qiniu');             // 使用七牛云上传 

$time     = date('Y/m/d'); 

$filename = $disk->put($time, $request->file('file')); // 上传 

$img_url  = $disk->downloadUrl($filename);  // 获取下载链接

 

 PHP 文件上传七牛云

 

打印一下获取的下载地址, 能看到说明已经上传成功了.

  PHP 文件上传七牛云

PHP 文件上传七牛云

 

  以你的域名和时间为前缀的图片地址就生成了, 这样你就可以以字符串的形式写入数据库, 引用的时候直接<img src=””, 即可.

 

4. qiniu/php-sdk

 

. 引入

 

  在控制器中, use

 

use Qiniu\Storage\UploadManager;

use Qiniu\Auth;

 PHP 文件上传七牛云

 

在方法中

 

 

$file = $request->file('file');  

// laravel 获取文件的信息, 若是平常PHP, 用$_FILES['file'].

      

       $tmpPath  = $file->getRealPath();    // 获取图片在本地绝对路径

       $ext      = $file->getClientOriginalExtension();   

// 获取后缀名

      

$fileName = time() . rand(1000, 10000) . '.' . $ext; 

// 拼接文件名

      

      

       $accessKey = 'AccessKey';                        # 公钥

       $secretKey = 'SecretKey';                                     # 私钥

        $upManager = new UploadManager();

        $auth    = new Auth($accessKey, $secretKey);

        $token = $auth->uploadToken($bucketName);    # 上传空间名称

        list($ret, $error) = $upManager->putFile($token, $fileName, $tmpPath);

 

Tip: 文档中用的是put, 但我试过用put 不成功, 改为putFile.

 

// 把参数依次传入, 上传后打印一下, 看到效果即成功.

      

       if ($error !== null) {

          dd($error);

       } else {

          dd($ret);

       }

 PHP 文件上传七牛云