laravel-filesystem-oss

by iiDestiny

:floppy_disk: Oss storage filesystem for Laravel.

226 Stars 21 Forks Last release: 7 months ago (2.0) 26 Commits 6 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

laravel filesystem oss

AliOss storage for Laravel based on iidestiny/flysystem-oss.

扩展包要求

  • PHP >= 7.0

安装命令

$ composer require "iidestiny/laravel-filesystem-oss" -vvv

配置

  1. 将服务提供者
    Iidestiny\LaravelFilesystemOss\OssStorageServiceProvider::class
    注册到
    config/app.php
    文件:
'providers' => [
    // Other service providers...
    Iidestiny\LaravelFilesystemOss\OssStorageServiceProvider::class,
],

Laravel 5.5+ 会自动注册服务提供者可过滤

  1. config/filesystems.php
    配置文件中添加你的新驱动
 [
        //...
        'oss' => [
            'driver' => 'oss',
            'root' => '', // 设置上传时根前缀
            'access_key' => env('OSS_ACCESS_KEY'),
            'secret_key' => env('OSS_SECRET_KEY'),
            'endpoint'   => env('OSS_ENDPOINT'), // 使用 ssl 这里设置如: https://oss-cn-beijing.aliyuncs.com
            'bucket'     => env('OSS_BUCKET'),
            'isCName'    => env('OSS_IS_CNAME', false), // 如果 isCname 为 false,endpoint 应配置 oss 提供的域名如:`oss-cn-beijing.aliyuncs.com`,否则为自定义域名,,cname 或 cdn 请自行到阿里 oss 后台配置并绑定 bucket
            // 如果有更多的 bucket 需要切换,就添加所有bucket,默认的 bucket 填写到上面,不要加到 buckets 中
            'buckets'=>[
                'test'=>[
                    'access_key' => env('OSS_ACCESS_KEY'),
                    'secret_key' => env('OSS_SECRET_KEY'),
                    'bucket'     => env('OSS_TEST_BUCKET'),
                    'endpoint'   => env('OSS_TEST_ENDPOINT'),
                    'isCName'    => env('OSS_TEST_IS_CNAME', false),
                ],
                //...
            ],
        ],
        //...
    ]
];

基本使用

// 上传
$disk->put('avatars/filename.jpg', $fileContents);

// 检查文件是否存在 $exists = $disk->has('file.jpg');

// 获取文件修改时间 $time = $disk->lastModified('file1.jpg'); $time = $disk->getTimestamp('file1.jpg');

// 拷贝文件 $disk->copy('old/file1.jpg', 'new/file1.jpg');

// 移动文件也可改名 $disk->move('old/file1.jpg', 'new/file1.jpg');

// 获取文件内容 $contents = $disk->read('folder/my_file.txt');

以上方法可在 laravel-filesystem-doc 查阅

进阶使用

// 获取文件访问地址「公共读的 bucket 才生效」
$url = $disk->getUrl('folder/my_file.txt');

// 设置文件访问有效期「$timeout 为多少秒过期」「私有 bucket 才可看见效果」 $url = $disk->signUrl('cat.png', $timeout, ['x-oss-process' => 'image/circle,r_100']);

// 和 signurl 功能一样,区别在于 $expiration 是未来过期时间如:2019-05-05 17:50:32 时链接失效 $url = $disk->getTemporaryUrl('file.md', $expiration);

// 可切换其他 bucket「需要在 config 配置文件中配置 buckets」 $exists = $disk->bucket('test')->has('file.jpg');

获取官方完整 OSS 处理能力

阿里官方 SDK 可能处理了更多的事情,如果你想获取完整的功能可通过此插件获取, 然后你将拥有完整的 oss 处理能力

// 获取完整处理能力
$kernel = $disk->kernel();

// 例如:防盗链功能 $refererConfig = new RefererConfig(); // 设置允许空Referer。 $refererConfig->setAllowEmptyReferer(true); // 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。 $refererConfig->addReferer("www.aliiyun.com"); $refererConfig->addReferer("www.aliiyuncs.com");

$kernel->putBucketReferer($bucket, $refererConfig);

更多功能请查看官方 SDK 手册

前端 web 直传配置

oss 直传有三种方式,当前扩展包使用的是最完整的 服务端签名直传并设置上传回调 方式,扩展包只生成前端页面上传所需的签名参数,前端上传实现可参考 官方文档中的实例 或自行搜索

/**
 * 1. 前缀如:'images/'
 * 2. 回调服务器 url
 * 3. 回调自定义参数,oss 回传应用服务器时会带上
 * 4. 当前直传配置链接有效期
 */
$config = $disk->signatureConfig($prefix = '/', $callBackUrl = '', $customData = [], $expire = 30);

直传回调验签

当设置了直传回调后,可以通过验签插件,验证并获取 oss 传回的数据 文档

注意事项: - 如果没有 Authorization 头信息导致验签失败需要先在 apache 或者 nginx 中设置 rewrite - 以 apache 为例,修改 httpd.conf 在 DirectoryIndex index.php 这行下面增加「RewriteEngine On」「RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]」

// 验签,就是如此简单
// $verify 验签结果,$data 回调数据
list($verify, $data) = $disk->verify();
// [$verify, $data] = $disk->verify(); // php 7.1 +

if (!$verify) { // 验证失败处理,此时 $data 为验签失败提示信息 }

// 注意一定要返回 json 格式的字符串,因为 oss 服务器只接收 json 格式,否则给前端报 CallbackFailed return response()->json($data);

直传回调验签后返回给前端的数据「包括自定义参数」,例如

{
    "filename": "user/15854050909488182.png",
    "size": "56039",
    "mimeType": "image/png",
    "height": "473",
    "width": "470",
    "custom_name": "zhangsan",
    "custom_age": "24"
}

这其实要看你回调通知方法具体怎么返回,如果直接按照文档给的方法返回是这个样子

前端直传组件分享「vue + element」




依赖的核心包

参考

License

LICENSE

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.