基于webman整合的league/flysystem V2/V3版本的本地上传/cos/oss/qiniu等(新增便捷/批量上传/base64上传/海报-水印-压缩上传)

TycoonSong

已上架插件市场 可取插件市场 插件市场

'Build Status' 'Latest Stable Version' 'Total Downloads' 'License'

  • 如果觉得方便了你,给个小星星鼓励一下吧
  • 如果你遇到问题 可以给我发邮件 8988354@qq.com
  • webman/admin插件版已上线https://www.workerman.net/app/view/filesystem

安装

composer require shopwwi/webman-filesystem

使用方法

  • 阿里云 OSS 适配器
composer require shopwwi/filesystem-oss
  • S3 适配器
composer require "league/flysystem-aws-s3-v3:^3.0"
  • 七牛云适配器(php7.X)
composer require "overtrue/flysystem-qiniu:^2.0"
  • 七牛云适配器(php8.X)
composer require "overtrue/flysystem-qiniu:^3.0"
  • 内存适配器
composer require "league/flysystem-memory:^3.0"
  • 腾讯云 COS 适配器(php7.x)
composer require "overtrue/flysystem-cos:^4.0"
  • 腾讯云 COS 适配器(php8.x)
composer require "overtrue/flysystem-cos:^5.0"

使用

通过FilesystemFactory::get('local') 来调用不同的适配器

    use Shopwwi\WebmanFilesystem\FilesystemFactory;
    public function upload(Request $request)
    {
        $file = $request->file('file');

        $filesystem =  FilesystemFactory::get('local');
        $stream = fopen($file->getRealPath(), 'r+');
        $filesystem->writeStream(
            'uploads/'.$file->getUploadName(),
            $stream
        );
        fclose($stream);

        // Write Files
        $filesystem->write('path/to/file.txt', 'contents');

        // Add local file
        $stream = fopen('local/path/to/file.txt', 'r+');
        $result = $filesystem->writeStream('path/to/file.txt', $stream);
        if (is_resource($stream)) {
            fclose($stream);
        }

        // Update Files
        $filesystem->update('path/to/file.txt', 'new contents');

        // Check if a file exists
        $exists = $filesystem->has('path/to/file.txt');

        // Read Files
        $contents = $filesystem->read('path/to/file.txt');

        // Delete Files
        $filesystem->delete('path/to/file.txt');

        // Rename Files
        $filesystem->rename('filename.txt', 'newname.txt');

        // Copy Files
        $filesystem->copy('filename.txt', 'duplicate.txt');

        // list the contents
        $filesystem->listContents('path', false);
    }

便捷式上传

  • 支持base64图片上传
  • 支持设定重复文件上传及文件覆盖
  • 支持指定文件名上传及文件覆盖
  • 新增图片处理器上传 (附加于强大的海报生成/图片压缩/水印等)
  • 
    use Shopwwi\WebmanFilesystem\Facade\Storage;
    public function upload(\support\Request $request){
         // 适配器 local默认是存储在runtime目录下 public默认是存储在public目录下
         // 可访问的静态文件建议public
         // 默认适配器是local
         Storage::adapter('public');
        //单文件上传
        $file = $request->file('file');
        // 上传第二参数默认为true即允许相同文件的上传 为false时将会覆盖原文件
        $result = Storage::upload($file,false);
        //单文件判断
        try {
            $result = Storage::adapter('public')->path('storage/upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->upload($file);
         }catch (\Exception $e){
            $e->getMessage();
         }
    
         //多文件上传
         $files = $request->file();
         $result = Storage::uploads($files);
         try {
         //uploads 第二个参数为限制文件数量 比如设置为10 则只允许上传10个文件 第三个参数为允许上传总大小 则本列表中文件总大小不得超过设定 第四参数默认为true即允许同文件上传 false则为覆盖同文件
            $result = Storage::adapter('public')->path('storage/upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->uploads($files,10,1024*1024*100);
         }catch (\Exception $e){
            $e->getMessage();
         }
    
        // 指定文件名上传(同文件将被覆盖)
        try {
            $files = $request->file();
            $fileName = 'storage/upload/user/1.png'; // 文件名中如此带了路径 则下面的path无效 未带路径1.png效果相等
            $ext = true; // 文件尾缀是否替换 开启后则$files上传的任意图片 都会转换为$fileName尾缀(示例: .png),默认false
            $result = Storage::adapter('public')->path('storage/upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->reUpload($file,$fileName,$ext);
         }catch (\Exception $e){
            $e->getMessage();
         }
    
        // base64图片上传
        try {
            $files = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAHCCAYAAAB8GMlFAAAAAXNSR0IArs4c6QAAAARnQU1BAACx...";
            $result = Storage::adapter('public')->path('storage/upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->base64Upload($files);
         }catch (\Exception $e){
            $e->getMessage();
         }
    
        // 强大的图片处理 你甚至可以创建画报直接保存
        // 在使用前 请确保你安装了 composer require intervention/image
        try {
            $files = $request->file();
            $fileName = 'storage/upload/user/1.png'; // 文件名中如此带了路径 则下面的path无效 未带路径1.png效果相等
            $ext = true; // 文件尾缀是否替换 开启后则$files上传的任意图片 都会转换为$fileName尾缀(示例: .png),默认false
            $result = Storage::adapter('public')->path('storage/upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->processUpload($file,function ($image){
                // 图片大小更改 resize()
                $image->resize(100,50)
                // 在图片上增加水印 insert()
                $image->insert('xxx/watermark.png','bottom-right',15,10)
                // 当然你可以使用intervention/image 中的任何功能 最终都会上传在你的storage库中
                return $image
            },$ext);
         }catch (\Exception $e){
            $e->getMessage();
         }
    
         //获取文件外网
         $filesName = 'storage/a4bab140776e0c1d57cc316266e1ca05.png';
         $fileUrl = Storage::url($filesName);
         //指定选定器外网
         $fileUrl = Storage::adapter('oss')->url($filesName);
    }


### 静态方法(可单独设定)

| 方法      | 描述            | 默认                 |
|---------|---------------|--------------------|
| adapter | 选定器           | config中配置的default  | 
| size    | 单文件大小         | config中配置的max_size |
| extYes  | 允许上传文件类型      | config中配置的ext_yes  |
| extNo   | 不允许上传文件类型     | config中配置的ext_no   |
| path    | 文件存放路径(非完整路径) | storage            |

### 响应字段

| 字段          |     描述           |  示例值                                                          |
|-------------|---------------|---------------------------------------------------------------|
| origin_name | 源文件名称         | webman.png                                                    |
| file_name   | 文件路径及名称       | storage/a4bab140776e0c1d57cc316266e1ca05.png                  |
| storage_key | 文件随机key       | a4bab140776e0c1d57cc316266e1ca05                              |
| file_url    | 文件访问外网        | //127.0.0.1:8787/storage/cab473e23b638c2ad2ad58115e28251c.png |
| size        | 文件大小          | 22175                                                         |
| mime_type   | 文件类型          | image/jpeg                                                    |
| extension   | 文件尾缀          | jpg                                                           |
| width       | 图片宽度(图片类型才返回) | 206                                                           |
| height      | 图片高度(图片类型才返回)        | 206                                                           |
4944 12 3
12个评论

walkor

感谢分享

  • 暂无评论
TycoonSong

新增便捷快速批量上传

便捷式上传

    use Shopwwi\WebmanFilesystem\Facade\Storage;
    public function upload(\support\Request $request){
        //单文件上传
        $file = $request->file('file');
        $result = Storage::upload($file);
        //单文件判断
        try {
            $result = Storage::adapter('local')->path('upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->upload($file);
         }catch (\Exception $e){
            $e->getMessage();
         }

         //多文件上传
         $files = $request->file();
         $result = Storage::uploads($files);
         try {
         //uploads 第二个参数为限制文件数量 比如设置为10 则只允许上传10个文件 第三个参数为允许上传总大小 则本列表中文件总大小不得超过设定
            $result = Storage::adapter('local')->path('upload/user')->size(1024*1024*5)->extYes(['image/jpeg','image/gif'])->extNo(['image/png'])->uploads($files,10,1024*1024*100);
         }catch (\Exception $e){
            $e->getMessage();
         }

         //获取文件外网
         $filesName = 'storage/a4bab140776e0c1d57cc316266e1ca05.png';
         $fileUrl = Storage::url($filesName);
         //指定选定器外网
         $fileUrl = Storage::adapter('oss')->url($filesName);
    }

静态方法(可单独设定)

方法 描述 默认
adapter 选定器 config中配置的default
size 单文件大小 config中配置的max_size
extYes 允许上传文件类型 config中配置的ext_yes
extNo 不允许上传文件类型 config中配置的ext_no
path 文件存放路径(非完整路径) storage

响应字段

字段 描述 示例值
origin_name 源文件名称 webman.png
file_name 文件路径及名称 storage/a4bab140776e0c1d57cc316266e1ca05.png
storage_key 文件随机key a4bab140776e0c1d57cc316266e1ca05
file_url 文件访问外网 //127.0.0.1:8787/storage/cab473e23b638c2ad2ad58115e28251c.png
size 文件大小 22175
mime_type 文件类型 image/jpeg
extension 文件尾缀 jpg
width 图片宽度(图片类型才返回) 206
height 图片高度(图片类型才返回) 206
  • 暂无评论
嘿嘿
"php": ">=8.1",

2022-04-05 12:43:59 pid:1 Worker process terminated with ERROR: E_ERROR "During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Qiniu\Http\Header::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Http\Header.php:114

Stack trace:

0 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Http\Header.php(8): {closure}(8192, 'Return type of ...', 'D:\laragon\www\...', 114)

1 D:\laragon\www\dev\vendor\composer\ClassLoader.php(571): include('D:\laragon\www\...')

2 D:\laragon\www\dev\vendor\composer\ClassLoader.php(428): Composer\Autoload\includeFile('D:\laragon\www\...')

3 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Http\Client.php(128): Composer\Autoload\ClassLoader->loadClass('Qiniu\Http\Head...')

4 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Http\Client.php(13): Qiniu\Http\Client::sendRequest(Object(Qiniu\Http\Request))

5 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Region.php(147): Qiniu\Http\Client::get('api.qiniu.com/v...')

6 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Zone.php(45): Qiniu\Region::queryRegion('qxM_haL4C7EoaG_...', 'woisks')

7 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Config.php(135): Qiniu\Zone::queryZone('qxM_haL4C7EoaG_...', 'woisks')

8 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Config.php(41): Qiniu\Config->getRegion('qxM_haL4C7EoaG_...', 'woisks')

9 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Storage\FormUploader.php(61): Qiniu\Config->getUpHost('qxM_haL4C7EoaG_...', 'woisks')

10 D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Storage\UploadManager.php(116): Qiniu\Storage\FormUploader::put('qxM_haL4C7EoaG_...', 'avatar', '\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x00\x00...', Object(Qiniu\Config), NULL, 'application/oct...', 'wor9AC9.tmp')

11 D:\laragon\www\dev\app\passport\controller\State.php(42): Qiniu\Storage\UploadManager->putFile('qxM_haL4C7EoaG_...', 'avatar', Object(Webman\Http\UploadFile))

12 D:\laragon\www\dev\framework-webman\App.php(331): app\passport\controller\State->online(Object(Webman\Http\Request))

13 D:\laragon\www\dev\framework-webman\App.php(146): Webman\App::findRoute(Object(Workerman\Connection\TcpConnection), '/passport/onlin...', 'POST/passport/o...', Object(Webman\Http\Request))

14 D:\laragon\www\dev\vendor\workerman\workerman\Connection\TcpConnection.php(638): Webman\App->onMessage(Object(Workerman\Connection\TcpConnection), Object(Webman\Http\Request))

15 D:\laragon\www\dev\vendor\workerman\workerman\Events\Select.php(295): Workerman\Connection\TcpConnection->baseRead(Resource id #196)

16 D:\laragon\www\dev\vendor\workerman\workerman\Worker.php(2431): Workerman\Events\Select->loop()

17 D:\laragon\www\dev\vendor\workerman\workerman\Worker.php(1430): Workerman\Worker->run()

18 D:\laragon\www\dev\vendor\workerman\workerman\Worker.php(1373): Workerman\Worker::forkWorkersForWindows()

19 D:\laragon\www\dev\vendor\workerman\workerman\Worker.php(549): Workerman\Worker::forkWorkers()

20 D:\laragon\www\dev\start.php(94): Workerman\Worker::runAll()

21 {main} in D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Http\Header.php on line 8"

2022-04-05 12:44:00 pid:1 Worker process terminated with ERROR: E_ERROR "During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Qiniu\Http\Header::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in D:\laragon\www\dev\vendor\qiniu\php-sdk\src\Qiniu\Http\Header.php:114

  • 嘿嘿 2022-04-05

    七牛云上传失败 的信息

  • TycoonSong 2022-04-08

    如果需支持8.0的选定器需安装composer require "overtrue/flysystem-qiniu:^3.0"

伯符

便捷式上传报错
指定适配器时
$path = Storage::adapter('qiniu')->path($storePath)->upload($image);
Undefined array key \"qiniu\
截图
默认适配器时
截图
截图

doit

Could not find a matching version of package shopwwi/flysystem-oss. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (stable).
请问这是composer源的问题吗?

  • TycoonSong 2022-10-01

    composer require shopwwi/filesystem-oss 用这个

yysu

OSS 会报
PositionNotEqualToLength: Position is not equal to file length RequestId

doit

截图
应为$this-config['max_size'],否则配置文件max_size不生效

sanye

最新版本的webman安装总是失败
安装信息如下:
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
./composer.json has been updated
Running composer update overtrue/flysystem-qiniu
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

Problem 1

  • league/mime-type-detection[1.0.0, ..., 1.11.0] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
  • overtrue/flysystem-qiniu[2.0.0, ..., 2.0.1] require league/flysystem ^2.0 -> satisfiable by league/flysystem[2.0.0, ..., 2.5.0].
  • league/flysystem[2.0.0, ..., 2.5.0] require league/mime-type-detection ^1.0.0 -> satisfiable by league/mime-type-detection[1.0.0, ..., 1.11.0].
  • Root composer.json requires overtrue/flysystem-qiniu ^2.0 -> satisfiable by overtrue/flysystem-qiniu[2.0.0, 2.0.1].

To enable extensions, verify that they are enabled in your .ini files:

  • /www/server/php/74/etc/php-cli.ini
    You can also run php --ini in a terminal to see which files are used by PHP in CLI mode.
    Alternatively, you can run Composer with --ignore-platform-req=ext-fileinfo to temporarily ignore these required extensions.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.

  • TycoonSong 2023-01-05

    看提示好像是说你的league/flysystem版本不对 看看是否安装到3.x了 现在默认都是php8以上版本了

  • keytehu 2023-01-05

    require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.

    英语都还给老师了?明显说的是系统缺少fileinfo扩展。

  • TycoonSong 2023-01-05

    英语确实不太好 😅

water2023

给力~

  • 暂无评论
jetlong

你好,请问这个支持直接连接 minio上传不?

  • 暂无评论
软饭工程师

你好,请问如何验证word、pdf、xlsx、wav、mp4,等等,希望支持验证更多的文件类型

  • 暂无评论
TycoonSong

新增了个图片处理上传接口 欢迎大家使用

  • 暂无评论
年代过于久远,无法发表评论

TycoonSong

1124
积分
0
获赞数
0
粉丝数
2021-10-29 加入
🔝