laravel 咋直接上传文件到阿里oss,不在本地缓存

laravel 本地上传文件怎么跳过服务器直接上传到阿里云oss

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

写个接口,让前端来调用获取上传的预授权。

public function getOssParams($dir, $name, $type = '')
    {
        $access_id = config('aliyunoss.access_id');
        $key = config('aliyunoss.access_key');
        $host = config('aliyunoss.bucket') . '.' . config('aliyunoss.endpoint');

        if (substr(trim($dir), -1) != "/") {
            $dir = $dir . "/";
        }
        $now = time();
        $expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
        $end = $now + $expire;
        $expiration = $this->gmt_iso8601($end);

        //最大文件大小.用户可以自己设置
        $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
        $conditions[] = $condition;

        //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
        $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
        $conditions[] = $start;

        $arr = array('expiration' => $expiration, 'conditions' => $conditions);

        $policy = json_encode($arr);
        $base64_policy = base64_encode($policy);
        $string_to_sign = $base64_policy;
        $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

        $params = array();
        $params['key'] = $dir . ($type && $type != '' ? (Uuid::uuid1()->getHex()) . '.' . (substr($type, strripos($type, '/') + 1)) : $name); //当设置了type时则生成uuid的文件名,否则使用原来的文件名
        $params['policy'] = $base64_policy;
        $params['OSSAccessKeyId'] = $access_id;
        $params['Signature'] = $signature;
        $params['expire'] = $end;

        $data = (object) null;
        $data->params = $params;
        $data->host = $host;

        return $data;
    }

    protected function gmt_iso8601($time)
    {
        $dtStr = date("c", $time);
        $mydatetime = new \DateTime($dtStr);
        $expiration = $mydatetime->format(\DateTime::ISO8601);
        $pos = strpos($expiration, '+');
        $expiration = substr($expiration, 0, $pos);
        return $expiration . "Z";
    }
3年前 评论
讨论数量: 8

前后端分离的话可以直接让前端调阿里云的接口进行文件上传。否则没法实现不在本地缓存一次,这是 php 实现机制的问题

3年前 评论
忆往昔弹指间 3年前
oolongd (作者) 3年前
未定义 3年前
忆往昔弹指间 3年前
oolongd (作者) 3年前
忆往昔弹指间 3年前
忆往昔弹指间 3年前
JeffreyBool

可以前端直传到阿里云,像你这种做法我做过,有几点影响吧, 第一: 会占用自己的带宽 第二: 上传速度很慢,如果要快的话自己要去解决很多问题,比如断网续传,分片上传,秒传等。。。 第三:自己做成本大

综合因素前端效率更高更好。,。。 阿里云oss 可以前端传完了可以回调给服务端,还有如果要限制的话,可以先在服务器拿到授权,在上传,这方面阿里云也有接口文档。。挺全的。。

3年前 评论

毛遂自荐一个 https://github.com/telstatic/rakan

3年前 评论

看阿里云对象存储最佳实践: 服务端签名直传并设置上传回调

一图胜千言,直接上图。
img

具体实现有示例代码可以看。如果有具体代码问题可以在回答后面回复。

3年前 评论

接口返回签名啥的,,前端直传oss 阿里云文档应该有demo

3年前 评论

写个接口,让前端来调用获取上传的预授权。

public function getOssParams($dir, $name, $type = '')
    {
        $access_id = config('aliyunoss.access_id');
        $key = config('aliyunoss.access_key');
        $host = config('aliyunoss.bucket') . '.' . config('aliyunoss.endpoint');

        if (substr(trim($dir), -1) != "/") {
            $dir = $dir . "/";
        }
        $now = time();
        $expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
        $end = $now + $expire;
        $expiration = $this->gmt_iso8601($end);

        //最大文件大小.用户可以自己设置
        $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
        $conditions[] = $condition;

        //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录
        $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
        $conditions[] = $start;

        $arr = array('expiration' => $expiration, 'conditions' => $conditions);

        $policy = json_encode($arr);
        $base64_policy = base64_encode($policy);
        $string_to_sign = $base64_policy;
        $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

        $params = array();
        $params['key'] = $dir . ($type && $type != '' ? (Uuid::uuid1()->getHex()) . '.' . (substr($type, strripos($type, '/') + 1)) : $name); //当设置了type时则生成uuid的文件名,否则使用原来的文件名
        $params['policy'] = $base64_policy;
        $params['OSSAccessKeyId'] = $access_id;
        $params['Signature'] = $signature;
        $params['expire'] = $end;

        $data = (object) null;
        $data->params = $params;
        $data->host = $host;

        return $data;
    }

    protected function gmt_iso8601($time)
    {
        $dtStr = date("c", $time);
        $mydatetime = new \DateTime($dtStr);
        $expiration = $mydatetime->format(\DateTime::ISO8601);
        $pos = strpos($expiration, '+');
        $expiration = substr($expiration, 0, $pos);
        return $expiration . "Z";
    }
3年前 评论
composer require iidestiny/laravel-filesystem-oss

github.com/iiDestiny/laravel-files...

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!