精华内容
下载资源
问答
  • 需要把图片上传至阿里云 OSS,我 Api 接口和后台项目是分开,都使用 laravel 框架开发,Api 接入 OSS 这里就不做讨论了,这里主要说一下 laravel-admin 上传阿里 OSS 问题。网上一些教程也有非常好,但...
    dafe2e8fec40e2f58c2b34f4f412b3ff.png

    php中文网最新课程

    每日17点准时技术干货分享

    2a1dc216f8f2d4185cf2818ab7b57415.png

    2fe23e779707481b9512d1296850ea00.gif

    前言

    因为项目需求,需要把图片上传至阿里云 OSS,我的 Api 接口和后台项目是分开的,都使用的 laravel 框架开发,Api 接入 OSS 这里就不做讨论了,这里主要说一下 laravel-admin 上传阿里 OSS 的问题。

    网上的一些教程也有非常好的,但只说了使用流程,很少有说碰到的问题之类的情况,这里主要就是讲述我在 laravel-admin 接入阿里 OSS 时所遇到的一些问题,以后还有问题时,也会在这里更新。

    开发环境

    下面是我的 composer.json 内容(只列出本文需要):

    "require": {    "php": ">=7.0.0",    "encore/laravel-admin": "^1.6",    "jacobcyl/ali-oss-storage": "^2.1",    "laravel/framework": "5.5.*",    ...}

    具体流程

    1、下载合适的第三方包

    在 composer.json 文件中的 require 添加 "jacobcyl/ali-oss-storage": "^2.1";

    或者直接运行 composer require jacobcyl/ali-oss-storage:^2.1 亦可。

    2、添加服务提供者

    在 config/app.php 文件下增加 Jacobcyl\AliOSS\AliOssServiceProvider::class,,如下图所示:

    e5620d2edba75cc74a6faa41747bf6a6.png

    3、在 config/filesystems.php 增加 OSS 配置信息

    如下:

    'disks' => [        'local' => [            'driver' => 'local',            'root' => storage_path('app'),        ],        'public' => [            'driver' => 'local',            'root' => storage_path('app/public'),            'url' => env('APP_URL').'/storage',            'visibility' => 'public',        ],                's3' => [            'driver' => 's3',            'key' => env('AWS_ACCESS_KEY_ID'),            'secret' => env('AWS_SECRET_ACCESS_KEY'),            'region' => env('AWS_DEFAULT_REGION'),            'bucket' => env('AWS_BUCKET'),        ],                // 这里是新增        'oss' => [            'driver' => 'oss',            'access_id' => // 这里是你的 OSS 的 accessId,            'access_key' => // 这里是你的 OSS 的 accessKey,            'bucket' => // 这里是你的 OSS 自定义的存储空间名称,            'endpoint' => 'oss-cn-hangzhou.aliyuncs.com', // 这里以杭州为例            'cdnDomain' => '', // 使用 cdn 时才需要写, https://加上 Bucket 域名            'ssl' => true, // true 使用 'https://' false 使用 'http://'. 默认 false,            'isCName' => false, // 是否使用自定义域名,true: Storage.url() 会使用自定义的 cdn 或域名生成文件 url,false: 使用外部节点生成url            'debug' => false,        ],    ],

    4、在 config/filesystems.php 更改 'default' 配置信息

    如下:

    'default' => env('FILESYSTEM_DRIVER', 'oss'),

    也可以在 env 文件中定义 FILESYSTEM_DRIVER = oss 也可。

    5、在 config/admin.php 修改 upload 配置

    如下:

    'upload' => [    // Disk in `config/filesystem.php`.    'disk' => 'oss', // 这里就是指向 disks 下面的 oss 配置    // Image and file upload path under the disk above.    'directory' => [        'image' => 'images',        'file'  => 'files',    ],],

    网上的步骤一般就是到这里了,上面的流程参考:laravel-admin 文件上传 oss;

    问题出现

    但是这时候问题就出现了, laravel-admin 本身为了开发者快速开发,本身就完成了一部分功能,当我们使用默认账号 admin 登录进去后,在后台的页面右上角和左上角都有默认的头像显示,这个默认头像是存放在本地 local 下的,在 vendor/encore/laravel-admin/resources/views/partials 下 header.blade.php 和 sidebar.blade.php 两个视图文件中显示,请看下图:

    header.blade.php

    7d64a933b1200a3e1d121f4353ce97df.png

    sidebar.blade.php

    2e78ccb0d57a1a924e347b953b8ac1f9.png

    而我们在 具体流程 的 5个步骤中已经把上传的配置改成了 oss 了,这时访问后台时,就会抛出一个异常:

    4bd5e0557288305b1447ce44d17cc72c.png

    一开始我以为是 config/filesystems.php 的 default 还写成 local 会解决,但结果并没有。由于时间的原因,我还没有深入去研究,对于 laravel 框架文件上传的原理,我还是个新手,不过这里放上我的解决方法,如果有更好的解决方案,欢迎下方指正,谢谢!

    解决

    把 header.blade.php 和 sidebar.blade.php 两个视图文件中的图片的 src 改成阿里云 OSS 存放图片的路径,比如:https://xxx.oss-cn-hangzhou.aliyuncs.com/xxx/xxx/5c77a20012963.jpg ,这张图片就是你想要上传的头像图片地址。

    这里只是举个例子,当然这样写还是不方便,万一以后更改,还是需要找到这两个文件手动改,很麻烦,可根据自身需求进行解耦优化,这里就不做讨论了。

    重新梳理问题

    之前遇到这个问题后一直没细研究,直到最近两天突然发现 laravel-admin 中的原有的管理员列表打开报错,报错信息如下(主要是这句报错信息):

    7da0c78cc31cb5c99ccbb5c8122c7a8e.png

    突然看到这个错,我心里一慌,为什么会报文件异常类没有找到,我首先想到的是不是我之前上传文件的配置有问题,但是回想一下我的程序后排除这个可能性。因为在上述配置完毕后,我已经成功把图片上传至阿里 OSS 上了,这就说明配置是成功的,那为什么还会报错呢,我就在想是不是有些细节是我没注意到的,经过测试,果然如此:

    laravel-admin 在安装完成后就已经有了系统设置这些板块,包括权限管理;

    数据库的迁移文件中也有了部分数据,其中 admin_users 数据表中就有一条数据;表结构如下:

    CREATE TABLE `admin_users` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `username` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,  `password` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL,  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,  `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,  `created_at` timestamp NULL DEFAULT NULL,  `updated_at` timestamp NULL DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `admin_users_username_unique` (`username`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    其中头像 avatar 字段的值,也就是 URL 地址是本地的路径,因为 laravel-admin 默认文件上传的磁盘是 local,但此时我已经把上传路径改为 OSS 了,这就导致文件系统加载不到原有的这张图,从而报的文件系统异常。

    更新解决

    之前我把上述的 header.blade.php 和 sidebar.blade.php 两个视图文件中的图片地址改了,只是解决一时问题,其实这两个文件并没有什么问题,我把两个视图文件还原(上面有图片),其中 {{ Admin::user()->avatar }} 就是从 admin_users 表中获取头像的 URL,只要表中这个 URL 是真实正确的(也就是 OSS 上的图片路径),那就可以成功加载!

    总结

    其实这个问题是一个非常简单的问题,上传文件的磁盘都已经改了,原先的路径自然就失效了,肯定加载失败!从管理员列表打开报错,到解决,只花费了不到5分钟的时间,可能就是之前没有冷静梳理:我要做的是什么?得到的结果是什么?过程中会遗漏什么?

    eb158a603bc27f30db2308f4c0bcffc4.png

    8acab3ae32e807940babbcd8b296fc35.png

    展开全文
  • laravel oss文件上传到阿里云

    千次阅读 2019-07-19 18:21:36
    需要自己注册阿里云账号并且开通oss服务,建立Bucket存储空间 ...构建 Service 文件需要自己手动建立 app/services/OSS.php 只需要修改下面信息,变成自己阿里云AccessKeyId AccessKe...

    需要自己注册阿里云账号并且开通oss服务,建立Bucket存储空间

     

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    使用composer在项目根目录执行以下命令  composer require johnlui/aliyun-oss:~2.0

    构建 Service 文件 需要自己手动建立 app/services/OSS.php 

     只需要修改下面的信息,变成自己的阿里云AccessKeyId AccessKeySecret就可以,注意OSS.php 文件中 private $city = ‘青岛’; 所对应的城市,要根据自己OSS相对应的地区所选择,如何查看自己的OSS地区,请到阿里云OSS中查看,修改错误会导致无法连接到阿里云OSS服务器

    <?php
    namespace App\Services;
    use JohnLui\AliyunOSS;
    use Exception;
    use DateTime;
    class OSS {
      /* 城市名称:
       *  
       *  经典网络下可选:杭州、上海、青岛、北京、张家口、深圳、香港、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
       *  VPC 网络下可选:杭州、上海、青岛、北京、张家口、深圳、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
       */    
      private $city = '青岛';
      // 经典网络 or VPC
      private $networkType = '经典网络';
      
      private $AccessKeyId = '';
      private $AccessKeySecret = '';
      private $ossClient;
      /**
       * 私有初始化 API,非 API,不用关注
       * @param boolean 是否使用内网
       */
      public function __construct($isInternal = false)
      {
        if ($this->networkType == 'VPC' && !$isInternal) {
          throw new Exception("VPC 网络下不提供外网上传、下载等功能");
        }
        $this->ossClient = AliyunOSS::boot(
          $this->city,
          $this->networkType,
          $isInternal,
          $this->AccessKeyId,
          $this->AccessKeySecret
        );
      }
      /**
       * 使用外网上传文件
       * @param  string bucket名称
       * @param  string 上传之后的 OSS object 名称
       * @param  string 上传文件路径
       * @return boolean 上传是否成功
       */
      public static function publicUpload($bucketName, $ossKey, $filePath, $options = [])
      {
        $oss = new OSS();
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
      }
      /**
       * 使用阿里云内网上传文件
       * @param  string bucket名称
       * @param  string 上传之后的 OSS object 名称
       * @param  string 上传文件路径
       * @return boolean 上传是否成功
       */
      public static function privateUpload($bucketName, $ossKey, $filePath, $options = [])
      {
        $oss = new OSS(true);
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
      }
      /**
       * 使用外网直接上传变量内容
       * @param  string bucket名称
       * @param  string 上传之后的 OSS object 名称
       * @param  string 上传的变量
       * @return boolean 上传是否成功
       */
      public static function publicUploadContent($bucketName, $ossKey, $content, $options = [])
      {
        $oss = new OSS();
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->uploadContent($ossKey, $content, $options);
      }
      /**
       * 使用阿里云内网直接上传变量内容
       * @param  string bucket名称
       * @param  string 上传之后的 OSS object 名称
       * @param  string 上传的变量
       * @return boolean 上传是否成功
       */
      public static function privateUploadContent($bucketName, $ossKey, $content, $options = [])
      {
        $oss = new OSS(true);
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->uploadContent($ossKey, $content, $options);
      }
      /**
       * 使用外网删除文件
       * @param  string bucket名称
       * @param  string 目标 OSS object 名称
       * @return boolean 删除是否成功
       */
      public static function publicDeleteObject($bucketName, $ossKey)
      {
        $oss = new OSS();
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->deleteObject($bucketName, $ossKey);
      }
      /**
       * 使用阿里云内网删除文件
       * @param  string bucket名称
       * @param  string 目标 OSS object 名称
       * @return boolean 删除是否成功
       */
      public static function privateDeleteObject($bucketName, $ossKey)
      {
        $oss = new OSS(true);
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->deleteObject($bucketName, $ossKey);
      }
      /**
       * -------------------------------------------------
       *
       * 
       *  下面不再分公网内网出 API,也不注释了,大家自行体会吧。。。
       *
       * 
       * -------------------------------------------------
       */
      public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
      {
        $oss = new OSS();
        return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
      }
      public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
      {
        $oss = new OSS();
        return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
      }
      // 获取公开文件的 URL
      public static function getPublicObjectURL($bucketName, $ossKey)
      {
        $oss = new OSS();
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->getPublicUrl($ossKey);
      }
      // 获取私有文件的URL,并设定过期时间,如 \DateTime('+1 day')
      public static function getPrivateObjectURLWithExpireTime($bucketName, $ossKey, DateTime $expire_time)
      {
        $oss = new OSS();
        $oss->ossClient->setBucket($bucketName);
        return $oss->ossClient->getUrl($ossKey, $expire_time);
      }
      public static function createBucket($bucketName)
      {
        $oss = new OSS();
        return $oss->ossClient->createBucket($bucketName);
      }
      public static function getAllObjectKey($bucketName)
      {
        $oss = new OSS();
        return $oss->ossClient->getAllObjectKey($bucketName);
      }
      public static function getObjectMeta($bucketName, $ossKey)
      {
        $oss = new OSS();
        return $oss->ossClient->getObjectMeta($bucketName, $ossKey);
      }
    }

     

    放入自动加载
    
    在 composer.json 中 autoload -> classmap 处增加配置:
    
    “autoload”: {
    “classmap”: [
    “app/services”
    ]
    }
    
    然后运行 composer dump-autoload

    获取文件路径

    创建控制器类 Util/UploadController 控制器用于接收前台上传的图片,上传到阿里云OSS,并且拿到返回路径。Bucket名称名称换成自己的

    控制器的使用
    namespace App\Http\Controllers\Util;
    
    use App\Http\Controllers\Controller;
    use App\Services\OSS;
    use Illuminate\Http\Request;
    
    class UploadController extends Controller
    {
        public function upload(Request $request)
        {
        //获取上传的文件
        $file = $request->file('file');
        //获取上传图片的临时地址
        $tmppath = $file->getRealPath();
        //生成文件名
        $fileName = str_random(5) . $file->getFilename() . time() .date('ymd') . '.' . $file->getClientOriginalExtension();
        //拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
        $pathName = date('Y-m/d').'/'.$fileName;
        //上传图片到阿里云OSS
        OSS::publicUpload('Bucket名称', $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]);
        //获取上传图片的Url链接
        $Url = OSS::getPublicObjectURL('Bucket名称', $pathName);
        // 返回状态给前端,Laravel框架会将数组转成JSON格式
        return ['code' => 0, 'msg' => '上传成功', 'data' => ['src' => $Url]];
    }
    }
    //模型使用,控制器调取使用即可
    <?php
    
    namespace App\Model;
    use App\Services\OSS;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Http\Request;
    
    class design extends Model
    {
        protected $table="";
        public $timestamps = false;
    
        public static function uploadOss($file)
        {
            if (!$file) {
                exit("请上传图片");
            }
            // 文件是否上传成功
            if ($file->isValid()) {
                // 获取文件相关信息
                $originalName = $file->getClientOriginalName(); // 文件原名
                $ext = $file->getClientOriginalExtension();     // 扩展名
                $realPath = $file->getRealPath();   //临时文件的绝对路径
                $type = $file->getClientMimeType();     // image/jpeg
                $content = date('Y-m-d H:i:s') . '-' . uniqid() . '.' . $ext;
                //上传图片到阿里云OSS
                OSS::publicUpload('$Bucket名字', $content,  $realPath, ['ContentType' => $file->getClientMimeType()]);
                //获取上传图片的Url链接
                $Url = OSS::getPublicObjectURL('$Bucket名字',  $content);
                // 返回结果
                if($Url){
                    return $Url;
                }else{
                    return exit('文件上传失败');
                }
            }
        }
    
    }
    

     

     

     

     

    展开全文
  • 这里使用到前端上传组件layui 上传aliyun组件使用是johnlui/AliyunOSS 安装 composer require johnlui/aliyun-oss:~2.0 构建 Service 文件 需要自己手动建立 app/services/OSS.php 内容可参考: ...

    需要自己注册阿里云账号并且开通oss服务,建立Bucket存储空间
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里使用到的前端上传组件layui 上传aliyun组件使用的是johnlui/AliyunOSS

    安装

    composer require johnlui/aliyun-oss:~2.0
    构建 Service 文件

    需要自己手动建立 app/services/OSS.php 内容可参考: https://github.com/johnlui/AliyunOSS/blob/master/example/OSS.php
    只需要修改下面的信息,变成自己的阿里云AccessKeyId AccessKeySecret就可以了

    private $city = '北京';
    private $networkType = '经典网络';
    //此处修改成成阿里云的AccessKeyId  AccessKeySecret
    private $AccessKeyId = '';
    private $AccessKeySecret = '';
    private $ossClient;
    

    放入自动加载

    在 composer.json 中 autoload -> classmap 处增加配置:

    “autoload”: {
    “classmap”: [
    “app/services”
    ]
    }
    然后运行 composer dump-autoload。

    获取文件路径

    创建控制器类 Util/UploadController 控制器用于接收前台上传的图片,上传到阿里云OSS,并且拿到返回路径。Bucket名称名称换成自己的

    namespace App\Http\Controllers\Util;

    use App\Http\Controllers\Controller;
    use App\Services\OSS;
    use Illuminate\Http\Request;

    class UploadController extends Controller
    {

    public function upload(Request $request)
    {
        //获取上传的文件
        $file = $request->file('file');
        //获取上传图片的临时地址
        $tmppath = $file->getRealPath();
        //生成文件名
        $fileName = str_random(5) . $file->getFilename() . time() .date('ymd') . '.' . $file->getClientOriginalExtension();
        //拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
        $pathName = date('Y-m/d').'/'.$fileName;
        //上传图片到阿里云OSS
        OSS::publicUpload('Bucket名称', $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]);
        //获取上传图片的Url链接
        $Url = OSS::getPublicObjectURL('Bucket名称', $pathName);
        // 返回状态给前端,Laravel框架会将数组转成JSON格式
        return ['code' => 0, 'msg' => '上传成功', 'data' => ['src' => $Url]];
    }
    

    }
    前端Layui代码

    我们使用的Laravel框架请求需要携带令牌所以我们需要在header和js上携带令牌,获取到后端return的返回接口可以在res接收返回的阿里云地址,创建form表单将res返回的地址使用jquery改变input的值,并且触发提交

    注意

    1.OSS.php 文件中 private $city = ‘青岛’; 所对应的城市,要根据自己OSS相对应的地区所选择,如何查看自己的OSS地区,请到阿里云OSS中查看,修改错误会导致无法连接到阿里云OSS服务器

    展开全文
  • 4,打开项目根目录配置文件env 配置oss配置参数;如下图(具体参数到自己oss账户中获取) 5,使用oss 上传图片功能实现后发现图片不能预览,虽说页面展示没问题,直接访问图片路径就自动下载了感觉很不舒服 查看...

    1,在项目的根目录composer.json文件中加入

    "aliyuncs/oss-sdk-php": "*"

    2,在项目的根目录中运行以下命令

    composer update
    

    3,执行成功之后会生成 \vendor\johnlui\aliyun-oss 的依赖包;
    4,打开项目根目录的配置文件env 配置oss配置参数;如下图(具体参数到自己oss账户中获取)
    在这里插入图片描述
    5,使用oss 上传图片功能实现后发现图片不能预览,虽说页面展示没问题,直接访问图片路径就自动下载了感觉很不舒服
    查看oss文档发现 需要把 OSS_CONTENT_TYPE => ‘image/jpg’;才能在线预览

    6,上传-删除的功能代码如下

    <?php
    declare(strict_types=1);
    
    namespace Common\Service;
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    use OSS\Core\OssUtil;
    
    
    class UploadFileService
    {
        /**
         * 获取OSS配置数据
         * @return array
         */
        private function ossConfig()
        {
            return [
                'accessId' => env('OSS_ACCESS_ID', ''),
                'accessKey' => env('OSS_ACCESS_KEY', ''),
                'endpoint' => env('OSS_ENDPOINT', 'https://oss-cn-hangzhou.aliyuncs.com'),
                'bucket' => env('OSS_BUCKET', 'wmm-cxtt')
            ];
        }
    
        /**
         * 上传文件到阿里云
         * @param $file
         * @param array $type
         * @return array
         */
        public function ossUpload($file, $type)
        {
            try {
                if ($file["file"]["error"] == 0) {
                    if ($type == 'img') {
                        return self::uploadImg($file);
                    } else {
                        return self::uploadFile($file);
                    }
                }
    
                return hello_error('文件不能为空!');
    
            } catch (\Exception $exception) {
                return hello_error('失败!', $exception->getMessage());
            }
    
        }
    
        /**
         * 上传图片到阿里云
         * @param $file
         * @return array
         */
        public function uploadImg($file)
        {
            try {
                if ($file['size'] > 10485760) {
                    return hello_error('上传的图片不能大于10MB');
                }
                $pixel = getimagesize($file['tmp_name']);//获取图片大小
                $suffix = explode('.', $file['name']);
                $pathName = 'admin/imgs/' . date('Y-m') . '/' . uniqid() . '.' . $suffix[1]; //生成文件名
                $filePath = $file['tmp_name']; //临时文件路径
    
                $config = self::ossConfig();
                $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
                $options = array(OssClient::OSS_CONTENT_TYPE => 'image/jpg');
                $result = $ossClient->uploadFile($config['bucket'], $pathName, $filePath, $options);
    
                if ($result['info']) {
                    $resData = [
                        'url' => $result['oss-request-url'],
                        'src' => $pathName . '?w=' . $pixel[0] . '&h=' . $pixel[1]
                    ];
                    return hello_success('上传成功', $resData);
                }
    
                return hello_error('上传失败!');
    
            } catch (\Exception $exception) {
                return hello_error('失败!', $exception->getMessage());
            }
        }
    
        /**
         * 富文本编辑器上传文件到阿里云
         * @param $file
         * @param $fileName
         * @return array
         */
        public function uedUploadFile($file, $fileName)
        {
            try {
                if ($file['size'] > 10485760) {
                    return hello_error('上传的图片不能大于10MB');
                }
    
                $pathName = 'men_hu/ueditor/' . date('Y-m') . '/' . $fileName; //生成文件名
                $filePath = $file['tmp_name']; //临时文件路基
    
                $config = self::ossConfig();
                $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
                $options = array(OssClient::OSS_CONTENT_TYPE => 'image/jpg');
                $result = $ossClient->uploadFile($config['bucket'], $pathName, $filePath, $options);
    
                if ($result['info']) {
                    $resData = ['src' => $pathName, 'url' => $result['info']['url']];
                    return hello_success('上传成功', $resData);
                }
    
                return hello_error('上传失败!');
    
            } catch (\Exception $exception) {
                return hello_error('失败!', $exception->getMessage());
            }
        }
    
        /**
         * 上传文件到阿里云
         * @param $file
         * @return array
         */
        public function uploadFile($file)
        {
            try {
                if ($file['size'] > 31457280) {
                    return hello_error('上传的文件不能大于30MB');
                }
    
                $suffix = explode('.', $file['name']);
                $pathName = 'admin/files/' . date('Y-m') . '/' . uniqid() . '.' . $suffix[1]; //生成文件名
                $filePath = $file['tmp_name']; //临时文件路基
    
                $config = self::ossConfig();
                $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
                $result = $ossClient->uploadFile($config['bucket'], $pathName, $filePath);
    
                if ($result['info']) {
                    $resData = ['src' => $pathName, 'url' => $result['info']['url'], 'size' => $file['size']];
                    return hello_success('上传成功', $resData);
                }
    
                return hello_error('上传失败!');
    
            } catch (\Exception $exception) {
                return hello_error('失败!', $exception->getMessage());
            }
        }
    
        /**
         * 文件分片上传
         * @param $file
         * @return array
         */
        public function uploadFileByPiece($file)
        {
            try {
                $suffix = explode('.', $file['name']);
                $pathName = 'men_hu/files/' . date('Y-m') . '/' . uniqid() . '.' . $suffix[1]; //生成文件名
                $uploadFile = $file['tmp_name']; //临时文件路基
    
                //步骤1:初始化一个分片上传事件,获取uploadId。
                $config = self::ossConfig();
                $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
                $uploadId = $ossClient->initiateMultipartUpload($config['bucket'], $pathName);
    
                //步骤2:上传分片。
                $partSize = 10 * 1024 * 1024;//一片10M
                $uploadFileSize = filesize($uploadFile);
                $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
                $responseUploadPart = array();
                $uploadPosition = 0;
                $isCheckMd5 = true;
                foreach ($pieces as $i => $piece) {
                    $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
                    $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
                    $upOptions = array(
                        // 上传文件。
                        $ossClient::OSS_FILE_UPLOAD => $uploadFile,
                        // 设置分片号。
                        $ossClient::OSS_PART_NUM => ($i + 1),
                        // 指定分片上传起始位置。
                        $ossClient::OSS_SEEK_TO => $fromPos,
                        // 指定文件长度。
                        $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
                        // 是否开启MD5校验,true为开启。
                        $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
                    );
                    // 开启MD5校验。
                    if ($isCheckMd5) {
                        $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
                        $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
                    }
                    try {
                        // 上传分片。
                        $responseUploadPart[] = $ossClient->uploadPart($config['bucket'], $pathName, $uploadId, $upOptions);
                    } catch (OssException $e) {
                        printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
                        printf($e->getMessage() . "\n");
                        return;
                    }
                    printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
                }
                // $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。
                $uploadParts = array();
                foreach ($responseUploadPart as $i => $eTag) {
                    $uploadParts[] = array(
                        'PartNumber' => ($i + 1),
                        'ETag' => $eTag,
                    );
                }
    
                //步骤3:完成上传。
                // 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
                $result = $ossClient->completeMultipartUpload($config['bucket'], $pathName, $uploadId, $uploadParts);
    
                if ($result['info']) {
                    $url = explode('?', $result['info']['url']);
                    $resData = ['src' => $pathName, 'url' => $url[0]];
                    return hello_success('上传成功', $resData);
                }
    
                return hello_error('上传失败!');
            } catch (\Exception $exception) {
                return hello_error('失败!', $exception->getMessage());
            }
    
        }
    
        /**
         * 删除OSS上指定文件
         * @param string $fileName
         * @return array
         */
        function ossDelete($fileName = '')
        {
            try {
                if (empty($fileName)) {
                    return hello_error('需要删除的文件名不能为空!');
                }
    
                $config = self::ossConfig();
                $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
    
                if ($ossClient->doesObjectExist($config['bucket'], $fileName)) {
                    $ossClient->deleteObject($config['bucket'], $fileName);
                    return hello_success('删除成功!');
                } else {
                    return hello_error('图片不存在!');
                }
            } catch (\Exception $exception) {
                return hello_error($exception->getMessage());
            }
        }
    }
    

    7,更多功能请查看oss官方文档
    https://help.aliyun.com/document_detail/88473.html?spm=a2c4g.11186623.6.1091.347d69cbQhXfj4

    8、 富文本编辑器上传文件到OSS
    https://blog.csdn.net/qq_41688060/article/details/108442965

    展开全文
  • composer require panwenbin/laravel-aliyunoss 部署: // config/filesystems.php 'default' => env('FILESYSTEM_DRIVER', 'oss'), // 缺省驱动改为oss ... 'disks' => [ ... // 增...
  • 因为项目需求,需要把图片上传至阿里云 OSS,我 Api 接口和后台项目是分开,都使用 laravel 框架开发,Api 接入 OSS 这里就不做讨论了,这里主要说一下 laravel-admin 上传阿里 OSS 问题。 网上一些教程也...
  • Laravel-Admin 上传图片/文件OSS(阿里云) 在Laravel-Admin中上传图片或者文件OSS 需要四步: 使用composer安装jacobcyl/ali-oss-storage包 在config/app.phpproviders内注册Jacobcyl\AliOSS\...
  • laravel-admin 文件上传oss

    千次阅读 2018-09-18 10:00:43
    1,在composer.json 文件 require 添加 "jacobcyl/ali-oss-storage": "^2.1" 2,在config/app.phpproviders下添加 Jacobcyl\AliOSS\AliOssServiceProvider::class, 3,在config...
  • 这里使用到前端上传组件layui 上传aliyun组件使用是johnlui/AliyunOSS 安装 composer require johnlui/aliyun-oss:~2.0 构建 Service 文件 需要自己手动建立 app/services/OSS.php 内容可参考: ...
  • laravel框架ueditor上传图片到阿里云oss

    千次阅读 2018-04-12 19:14:09
    首先下载ueditor文件编辑器 http://ueditor.baidu.com/website/download.html 将下载ueditor解压后放到laravel框架下public文件中我放在了这下面是具体内容操作和修改第一步新建文件:OssInUe.php (位置:...
  • Laravel5.6如何上传图片值阿里云OSS

    千次阅读 2019-01-18 15:38:51
    第一步:我们得下载阿里云存储的laravel插件 “jacobcyl/ali-oss-storage”,这里我们用composer安装其插件,如果不知道怎么安装composer,请自行百度。安装方式有两种: 在composer.json文件的require项中添加...
  • laravel ueditor上传oss首先...好吧,看这里laravel oss教程下变开始修改uedit的文件实现oss上传一行修改三处进入项目根目录下/vendor/stevenyangecho/laravel-u-editor/src/Uploader 目录下需要修改两个文件:Upl...
  • Laravel 使用阿里OSS+阿里媒体处理-阿里OSS官方后台配置阿里OSS官方后台创建存储空间第一步:准备工作以上就是Laravel 5.7 +php 使用阿里官方上传SDK和conposer下载阿里媒体处理拓展详细使用方法。 阿里OSS官方...
  • Laravel 使用 aliyun-oss

    2018-04-20 14:23:51
    从官方composer 下载下来的vendor里面的ossClient文件下的上传方法uploadFile有bug实例化调用后的upload()即可;第一个参数:D:/phpSduy/www/laravel/public/fim/111.jpg ; 第二个参数为:图片名称;...
  • Laravel admin 使用技巧 - 上传文件到阿里云 哦豁,见面了。 1.首先根据Laravel-admin 上提供上传文档走哈。(第一步下载composer包) composer require jacobcyl/ali-oss-storage:^2.1 2.去除限制不然报错...
  • Laravel至阿里云OSS使用

    2020-10-13 11:05:51
    Laravel 7.x 整合阿里云oss储存1、什么是oss2、阿里云OSS-SDK简单...阿里云OSS将数据文件以对象(Object)形式上传到存储空间(Bucket)中。您可以进行以下操作: 创建一个或者多个存储空间,向每个存储空间中添加一
  • 目前为止UEditor以可以正常在Laravel中使用,接下来准备改造UEditor实现将文件上传至阿里云OSS中 直接上干货,后面有实现原理分析有兴趣可以看看,原理都一样在其他框架和语言中都可以使用类似方法进行对...
  • 背景 之前做备份时,主要是拿一台备份机...后来发现阿里云OSS的冷冻OSS一年100G也不过几十块,用它备份更便宜也更便捷,于是对于小项目便改用更简单方法:Laravel定期将数据库和文件打包备份到阿里云OSS(其他云...
  • laravel-admin图片上之OSS

    千次阅读 2018-06-29 10:23:48
    laravel-admin中move上传只需修改配置文件即可。首先要安装composer 第一步:在composer.json 中 require添加 "jacobcyl/ali-oss-storage": "^2.1" 然后在cmd里运行composer update 第二步:在config/app....
  • laravel + webupload + 阿里云OSS直传分享

    千次阅读 2019-08-20 11:29:58
    最近在做管理后天时,要上传一些app包文件,这些包大小都在几...这示例文档已经说得很清楚,你唯一要做就是下载PHP示例包,继承到自己项目根目录中,测试下示例是否能上传文件oss,然后再想办法集成到webupload...
  • 由于项目需求原因,需要将文件上传至阿里云对象存储OSS中,项目使用Laravel框架。 安装UEditor方法: (1)打开项目根目录下composer.json 文件然后在require中加入“stevenyangecho/laravel-u-editor”...
  • put()</code> 上传文件报错,部分错误信息如下: <pre><code>php { "message": ": RequestId: 5E832A2C88FF193538F3771A", "exception": "OSS\\Core\\OssException",...
  • 有一个使用laravel框架项目,采用laravel自带的文件管理系统,还有一个使用laravel-admin扩展管理端,更是依赖于自带的文件管理系统。因部署了多台服务器,需要打通数据,考虑了各种方案,比如fastdfs、oss,...
  • 问题:上传视频至阿里云oss,大文件莫名会上传两次,而且前端每次大约在4.1min时候断开连接 思路:因为在阿里云控制台可以看到同一个视频被上传了两次,猜测是前端框架或者后端框架做了一次链接retry ...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

laravel的oss上传文件