当前位置:首页 > CMS教程 > 其它CMS > 列表

laravel 实现阿里云oss文件上传功能的示例

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-16 09:08:01 浏览: 评论:0 

这篇文章主要介绍了laravel 实现阿里云oss文件上传功能,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下。

1、定义路由

  1. // 阿里云文件储存 
  2. Route::group(['prefix'=>'aliyun'], function(){ 
  3.     Route::get('sign''AliyunController@sign'); 
  4. }); 

2、编写 controller 层

  1. /** 
  2.      * 返回OSS的签名验证 
  3.      * @return JSON 签名信息 
  4.      */ 
  5.     public function sign(Request $request
  6.     { 
  7.         //初始化一下必要的请求数据 
  8.         $id = 'xxx';   //AccessKeyId 
  9.         $key = 'xxx';  //AccessKeySecret 
  10.         $host = '//xxx.oss-cn-shenzhen.aliyuncs.com';  //OSS库地址 
  11.         $cdn_host = "//img.xxx.com"; //真实的访问地址 
  12.         $dir = 'test/';  //上传目录设置 
  13.         $callbackUrl = url('upload/callback');  //上传回调的地址 
  14.  
  15.         //上传回调的参数,callbackUrl地址,callbackBody回调接收的参数,callbackBodyType通过POST调用的回调函数,所以要设置这个头 
  16.         $callback_param = array
  17.             'callbackUrl' => $callbackUrl
  18.             'callbackBody' => 'filename=${object}&size=${size}&mimeType =${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}'
  19.             'callbackBodyType' => "application/x-www-form-urlencoded" 
  20.         ); 
  21.         $callback_string = json_encode($callback_param);  //转换成json格式 
  22.         $base64_callback_body = base64_encode($callback_string); //要返回的回调函数参数信息 
  23.  
  24.         //设置过期时间 
  25.         $now = time(); 
  26.           
  27.         $expire = 60 * 60 * 2; //设置该policy超时时间是 2小时. 即这个policy过了这个有效时间,将不能访问,这里可以根据自己的token过期时间来设置 
  28.         $end = $now + $expire
  29.         $expiration = $this->gmt_iso8601($end);  //进行时间格式的转换 
  30.  
  31.  
  32.         //处理上传限制条件 
  33.         //最大文件大小.用户可以自己设置 
  34.         $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000); 
  35.         $conditions[] = $condition//设定文件大小 
  36.         //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录 
  37.         $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir); 
  38.         $conditions[] = $start;  //必须以设定的目录开头,防止上传错误 
  39.         $arr = array('expiration' => $expiration'conditions' => $conditions); 
  40.         $policy = json_encode($arr); 
  41.         $base64_policy = base64_encode($policy);  //要返回的上传限制参数 
  42.  
  43.         //签名信息 
  44.         $string_to_sign = $base64_policy
  45.         $signature = base64_encode(hash_hmac('sha1'$string_to_sign$key, true));  //要返回的签名信息 
  46.  
  47.         //设置返回信息 
  48.         $response = array
  49.             'accessid' => $id,  //accessid 
  50.             'host' => $host,    //上传地址 
  51.             'cdn_host' => $cdn_host,    //真实的访问地址 
  52.             'policy' => $base64_policy,  //上传文件限制 
  53.             'signature' => $signature,   //签名信息 
  54.             'expire' => $end,    //失效时间 
  55.             'callback' => $base64_callback_body,  //上传回调参数 
  56.             'dir' => $dir     //上传的目录 
  57.         ); 
  58.         return response()->json([ 
  59.             'code' => 0, 
  60.             'msg' => 'success'
  61.             'data' => $response 
  62.         ]); 
  63.     } 
  64.  
  65.     //格式化时间,格式为2020-07-07T23:48:43Z 
  66.     public function gmt_iso8601($time
  67.     { 
  68.         $dtStr = date("c"$time); 
  69.         $pos = strpos($dtStr'+'); 
  70.         $expiration = substr($dtStr, 0, $pos); 
  71.         return $expiration . "Z"
  72.     } 

3、查看接口返回

laravel 实现阿里云oss文件上传功能的示例

4、前端界面及操作编写,这里采用的是 vue

  1. <template> 
  2.     <div class="test" style="padding:100px 0px 1000px 0px;"
  3.         <div> 
  4.                   
  5.             <input type="file" id="file" name="file" /> 
  6.             <a @click="upload()" href="javascript:;" rel="external nofollow" >上传</a> 
  7.  
  8.         </div> 
  9.     </div> 
  10. </template> 
  11.  
  12.  
  13.  
  14. <script> 
  15. export default { 
  16.     data(){ 
  17.         return { 
  18.  
  19.         } 
  20.     }, 
  21.     mounted() { 
  22.       
  23.         this.getOssToken(); 
  24.     }, 
  25.     methods: { 
  26.         //获取上传通行证 
  27.         getOssToken(){ 
  28.             var _self = this
  29.              this.axios.get('/aliyun/sign').then((res)=>{ 
  30.                 var data = res.data; 
  31.                 if(data.code==0){    
  32.                     _self.aliyunOssToken = data.data; 
  33.                 }else
  34.                     _self.$message.warning(data.msg); 
  35.                 } 
  36.             }); 
  37.         }, 
  38.  
  39.         upload(){ 
  40.             var _self = this
  41.             var getSuffix = function (fileName) { 
  42.                 var pos = fileName.lastIndexOf("."); 
  43.                 var suffix = ''
  44.                 if (pos != -1) { 
  45.                     suffix = fileName.substring(pos); 
  46.                 } 
  47.                 return suffix; 
  48.             } 
  49.  
  50.             var file = $("#file").val(); 
  51.             if (file.length == 0) { 
  52.                 alert("请选择文件"); 
  53.             } 
  54.  
  55.             var oFileName = file.lastIndexOf('\\'); 
  56.             var oFileName = file.substr(oFileName+1); 
  57.             var fileName = oFileName.lastIndexOf('.'); 
  58.             var fileName = oFileName.substr(0,fileName); 
  59.  
  60.             console.log(fileName); 
  61.  
  62.  
  63.             var filename = new Date().getTime() + getSuffix(file); 
  64.             var formData = new FormData(); 
  65.  
  66.             //注意formData里append添加的键的大小写 
  67.             formData.append('key', _self.aliyunOssToken.dir + filename); //存储在oss的文件路径 
  68.             formData.append('OSSAccessKeyId', _self.aliyunOssToken.accessid); //accessKeyId 
  69.             formData.append('policy', _self.aliyunOssToken.policy); //policy 
  70.             formData.append('Signature', _self.aliyunOssToken.signature); //签名 
  71.             formData.append("file", $("#file")[0].files[0]); 
  72.             formData.append('success_action_status', 200); //成功后返回的操作码 
  73.  
  74.  
  75.             var url = _self.aliyunOssToken.host; 
  76.             var fileUrl = _self.aliyunOssToken.cdn_host +'/'+ _self.aliyunOssToken.dir + filename; 
  77.             $.ajax({ 
  78.                 url: url, 
  79.                 type: 'POST'
  80.                 data: formData, 
  81.                 // async: false, 
  82.                 cache: false
  83.                 contentType: false
  84.                 processData: false
  85.                 success: function (data) { 
  86.                     console.log(fileUrl); 
  87.                     console.log(data); 
  88.                 }, 
  89.                 error: function (data) { 
  90.                     console.log(data); 
  91.                 } 
  92.             }); 
  93.         } 
  94.     } 
  95. </script> 

5、点击上传按钮,浏览器控制台输出链接,访问该链接,即可看到该图片

laravel 实现阿里云oss文件上传功能的示例

Tags: laravel文件上传 阿里云oss

分享到: