Laravel5.7+ 使用 AliyunOSS 上传

这里使用到的前端上传组件 layui 上传 aliyun 组件使用的是 johnlui/AliyunOSS

 

安装

composer require johnlui/aliyun-oss:~2.0

  

构建 Service 文件

新建 app/services/OSS.php 内容可参考: 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, 并且拿到返回路径,需要注意的是下面代码中 publicUpload getPublicObjectURL 方法后面第一个参数要换成阿里云 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 的值,并且触发提交

<meta name="csrf-token" content="{{ csrf_token() }}">

  

  <script>
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
    </script>
    <script>
        layui.use('upload', function () {
            var $ = layui.jquery
                , upload = layui.upload;

            //普通图片上传
            var uploadInst = upload.render({
                elem: '#test1'
                , url: '{{route('util.upload')}}'
                , accept: 'images'
                , before: function (obj) {
                    //预读本地文件示例,不支持ie8
                    obj.preview(function (index, file, result) {
                        $('#icon').attr('src', result); //图片链接(base64)
                    });
                }
                , done: function (res) {
                    //如果上传失败
                    if (res.code > 0) {
                        return layer.msg('上传失败');
                    }
                    //上传成功
                    if (res.code == 0) {
                        console.log(res.data.src);
                        $('#iconUrl').val(res.data.src);
                        $('#saveIcon').submit()
                    }

                }
                , error: function () {
                    //演示失败状态,并实现重传
                    var demoText = $('#demoText');
                    demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
                    demoText.find('.demo-reload').on('click', function () {
                        uploadInst.upload();
                    });
                }
            });
        });
    </script>

  

注意

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

2. 使用 homestead 小伙伴需要把 config/app 文件中 timezone 修改成 PRC

'timezone' => 'PRC',

 

posted @ 2019-12-30 11:31  明明一颗大白菜  阅读(601)  评论(0编辑  收藏  举报
<-- -->