最佳答案
写个接口,让前端来调用获取上传的预授权。
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";
}
讨论数量:
可以前端直传到阿里云,像你这种做法我做过,有几点影响吧, 第一: 会占用自己的带宽 第二: 上传速度很慢,如果要快的话自己要去解决很多问题,比如断网续传,分片上传,秒传等。。。 第三:自己做成本大
综合因素前端效率更高更好。,。。 阿里云oss 可以前端传完了可以回调给服务端,还有如果要限制的话,可以先在服务器拿到授权,在上传,这方面阿里云也有接口文档。。挺全的。。
写个接口,让前端来调用获取上传的预授权。
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";
}
推荐文章: