zoukankan      html  css  js  c++  java
  • PHP 文件上传七牛云

    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">

     

     

     

     

     

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

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

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

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

     

    e) 处理.

     

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

     

     

     

     

     

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

     

    三. 安装

     

    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: 这时候安装过程会出现一个错误.

     

     

     

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

     

    composer require doctrine/instantiator

     

     

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

     

    composer require itbdw/laravel-storage-qiniu

     

     

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

     

     

     

    四. 使用

     

    a) itbdw/laravel-storage-qiniu

     

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

    itbdwQiniuStorageQiniuFilesystemServiceProvider::class,

     

     

    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)

     

     

    'access_key'   # 公钥

    'secret_key'   # 密钥

     

     

     

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

     

      

    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);  // 获取下载链接

     

     

     

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

      

     

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

     

    4. qiniu/php-sdk

     

    . 引入

     

      在控制器中, use

     

    use QiniuStorageUploadManager;

    use QiniuAuth;

     

     

    在方法中

     

     

    $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);

           }

     

     

     

     

  • 相关阅读:
    忍道
    2020.12.27
    2020.12.26
    2020.12.25
    记录
    卸载抖音
    汉化报告修改配置文件
    tcp校验client客户端的合法性
    tcp连接发送命令客户端接收后返回结果给服务端
    logging模块
  • 原文地址:https://www.cnblogs.com/loseself/p/8933193.html
Copyright © 2011-2022 走看看