UCloud Ufile javascript实现


由于公钥和密钥不能直接存放在前段,后端采用php,来生成auth
查找相关文章:UCloud Ufile javascript

由于公钥和密钥不能直接存放在前段,后端采用php,来生成auth

直接贴php代码!

注:

  1. 公钥和私钥是随意填写的,请勿直接测试

  2. 只是做了简单实现,如用于生产环境请谨慎


配置信息 config/config.inc.php

<?php
$_config = array();
$_config['SDK_VER'] = '1.0.2';
$_config['UCLOUD_PROXY_SUFFIX'] = '.ufile.ucloud.cn';

$_config['UCLOUD_PUBLIC_KEY'] = 'Y4l+123123123sddfsdsxcadsads/iaoxgivI//e';
$_config['UCLOUD_PRIVATE_KEY'] = '82a7a618e86b051212ass9d9f6222332a11680';

基础php文件 include/base.php 这些方法在ucloud的sdk中能找到

<?php
define('BLKSIZE', 4*1024*1024);
define("NO_AUTH_CHECK", 0);
define("HEAD_FIELD_CHECK", 1);
define("QUERY_STRING_CHECK", 2);

class base {

	private $_config;

	public function __construct(){
		$_config = array();
		require ROOTPATH.'config/config.inc.php';
		$this->_config = $_config;
	}

	/**
	 * 生成签名
	 * @param array $params
	 * @return string
	 */
	public function genSignature($params) {
	   ksort($params);
	   $params_data = '';
	   foreach($params as $key => $value) {
		   $params_data .= $key;
		   $params_data .= $value;
	   }

	   $params_data .= $this->_config['UCLOUD_PRIVATE_KEY'];
	   return sha1($params_data);
	}

	/**
	 * 生成头校验信息
	 */
	public function genAuthorization($req, $mimetype = null, $type = HEAD_FIELD_CHECK){
		$data = '';
		$data .= strtoupper($req['METHOD']) . "\n";
		$data .= $this->get_default_value('Content-MD5',$req['Header'],'') . "\n";
		if ($mimetype){
			$data .=  $mimetype . "\n";
		}else{
			$data .= $this->get_default_value('Content-Type',$req['Header'],'') . "\n";
		}

		if ($type === HEAD_FIELD_CHECK){
			$data .= $this->get_default_value('Date',$req['Header'],'') . "\n";
		}else{
			$data .= $this->get_default_value('Expires',$req['Header'],'') . "\n";
		}

		$data .= $this->buildBucketKey($req['Bucket'], $req['Key']);
		$data .= $this->buildHeader($req['Header']);

		return $this->sign($data);
	}

	/**
	 * 头部校验信息
	 * @param unknown_type $data
	 * @return string
	 */
	private function sign($data){
		$sign = base64_encode(hash_hmac('sha1', $data, $this->_config['UCLOUD_PRIVATE_KEY'], true));
		return "UCloud " . $this->_config['UCLOUD_PUBLIC_KEY'] . ":" . $sign;
	}

	private function buildBucketKey($bucket,$key){
		return "/" . $bucket . "/" . $key;
	}

	private function buildHeader($headers){
		$keys = array();
		foreach($headers as $header) {
			$header = trim($header);
			$arr = explode(':', $header);
			if (count($arr) < 2) continue;
			list($k, $v) = $arr;
			$k = strtolower($k);
			if (strncasecmp($k, "x-ucloud") === 0) {
				$keys[] = $k;
			}
		}

		$str = '';
		sort($keys, SORT_STRING);
		foreach($keys as $k) {
			$str .= $k . ":" . trim($headers[$v], " ") . "\n";
		}
		return $str;
	}

	private function get_default_value($key,$obj,$default=''){
		$v = '';
		if(is_object($obj)){
			if(isset($obj->$key)){
				$val = $obj->$key;
				$v = $val;
				if(is_array($val)){
					$v = $val[0];
				}
			}
		}elseif(is_array($obj)){
			if(isset($obj[$key])){
				$val = $obj[$key];
				$v = $val;
				if(is_array($val)){
					$v = $val[0];
				}
			}
		}
		if($v == ''){
			$v = $default;
		}
		return $v;
	}

	/**
	 * 输出前段回调的json数据
	 * @param array $data
	 */
	public function __callback($data=array(),$jsonp=''){
		$reason = array();

		if (!empty($this->error)){

		}

		$json = json_encode(array('error'=>!empty($reason), 'reason'=>$reason, 'data'=>$data));
		if($jsonp != ''){
			echo $jsonp.'('.$json.');';
		}else{
			echo $json;
		}
		exit;
	}
}

生存token和auth方法 /test/index.php

<?php
define('IN_KZ', true);

require './includes/common.php';

$base = new base();

$act = (isset($_REQUEST['act'])) ? $_REQUEST['act'] : '';

if($act == 'sign'){
	$sign = $base->genSignature($_POST);
	$data = array('sign'=>$sign);
	$base->__callback($data);
}elseif($act == 'auth'){
	/* $req = array();
	$req['METHOD'] = 'POST';
	$req['Bucket'] = 'download';
	$req['Key'] = 'test123.jpg';
	$req['Header'] = array(); */

	$req = $_REQUEST;
	if(!isset($req['METHOD'])){
		$req['METHOD'] = 'get';
	}
	if(!isset($req['Header'])){
		$req['Header'] = array();
	}
	if(!isset($req['Bucket'])){
		$req['Bucket'] = 'download';
	}
	if(!isset($req['Key'])){
		$this->error[] = '参数错误';
		$this->__callback();
	}

	$auth = $base->genAuthorization($req);
	$data = array('auth'=>$auth);

	$base->__callback($data);
}


前段javascript

var PublicKey = 'Y4l+123123123sddfsdsxcadsads/iaoxgivI//e';

var api_sign_url = '/test/ucloud/index.php';
var api_auth_url = '/test/ucloud/index.php';

//获取token
function getSign(_params){
	  var sign = '';
	  $.ajax({
			'type':'post',
			url: api_sign_url+'/index.php?act=sign',
			data: _params,
			//processData: false,
			async: false,
			dataType: "json",
			success:function(res) {
				_callback(res,function(){
					var data = res.data;
					//var Signature = data.sign;
					sign = data.sign;
				})
			},
			error:function() {
			}
		});
	  return sign;
}

//获取Auth
function getAuth(Bucket,Key,METHOD,Header){
	  var _params = {
			  "METHOD":METHOD,
			  "Header":Header,
			  "Bucket":Bucket,
			  "Key":Key
	  };
	  var auth = '';
	  $.ajax({
			'type':'post',
			url: api_auth_url+'/index.php?act=auth',
			data: _params,
			async: false,
			dataType: "json",
			success:function(res) {
				_callback(res,function(){
					var data = res.data;
					auth = data.auth;
				})
			},
			error:function() {
			}
		});
	  return auth;
}

上传文件

$('#upload_file').click(function(){
		  
		  var file = $("#file")[0].files[0],  //文件对象
          name = file.name,        //文件名
          size = file.size,        //总大小
          succeed = 0;
      
	      console.log(1223,file);
	      var content_type = file.type;
	      	            
	      var Bucket = 'download';
		  var Key = 'test123.jpg';
		  var METHOD = 'PUT';
		  var Header = {"Content-Type": content_type,
          		"Content-Length":size
      		};
		  
		  
	      var auth = getAuth(Bucket,Key,METHOD,Header);//获取授权
	      
	      var _data = file.slice(0,size);
	      
	      $.ajax({
		  		url:'http://'+Bucket+'.ufile.ucloud.cn/'+Key,
		  		type:"PUT",
		  		processData: false,
		  		async: false,
		  		data:_data,
		  		headers: {
		            "Authorization":auth,
		            "Content-Type": content_type,
		            "Content-Length":size
		        },
		  		success: function (response, textStatus, jqXHR) {
		            console.log(response,textStatus,jqXHR);
		        }
	  		});
	   });

分片上传

var page = {
	        init: function(){
	            $("#upload").click($.proxy(this.upload, this));
	        },
	         
	        upload: function(){
	            var file = $("#file")[0].files[0],  //文件对象
	                name = file.name,        //文件名
	                size = file.size,        //总大小
	                succeed = 0;
	            
	            console.log(1223,file);
	            var content_type = file.type;
	            	            
	            var Bucket = 'download';
	  	    var Key = 'test123.jpg';
	  	    var METHOD = 'post';
	  	    var Header = [];
	  		  
	            var auth = getAuth(Bucket,Key,METHOD,Header);//获取授权
	            
	            //获取分片 async: false,
	            var bucket_file_info;
	            $.ajax({
	            	type:METHOD,
	            	url:'http://'+Bucket+'.ufile.ucloud.cn/'+Key+'?uploads',
	            	processData: false,
	            	dataType: "json",
	            	async: false,
	            	headers: {
			            "Authorization":auth
			        },
			success: function (response) {
			            bucket_file_info = response;
			        }
		  	});
	            
	            
	            var Bucket = 'download';
	            var Key = 'test123.jpg';
	  	    var METHOD = 'PUT';
                    var Header = {};
                    Header['Content-Type'] = content_type;
	  		  
	            var auth = getAuth(Bucket,Key,METHOD,Header);
	            
	            var UploadId = bucket_file_info.UploadId;
	            
	            var shardSize = bucket_file_info.BlkSize,
	                shardCount = Math.ceil(size / shardSize);   //总片数
	            
	            var ETag_arr = [];
	            for(var partNumber = 0;partNumber < shardCount;++partNumber){
	                //计算每一片的起始与结束位置
	                var start = partNumber * shardSize,
	                    end = Math.min(size, start + shardSize);
	                
	                var _data = file.slice(start,end);
	                console.log(_data);
	                
	                //ajax提交内容
	                $.ajax({
	                url:'http://'+Bucket+'.ufile.ucloud.cn/'+Key+'?uploadId='+UploadId+'&partNumber='+partNumber,
	                type:"PUT",
	                processData: false,
	                async: false,
	                data:_data,
	                headers: {
	                    "Authorization":auth,
	                    "Content-Type": content_type
	                },
	                success: function (response, textStatus, jqXHR) {
	                    console.log(response);
	                    ETag_arr.push(jqXHR.getResponseHeader('ETag'));
	                }
	              });
	            }
	            //ETag_arr.push('HF-smK_6-rPCl1jpLYSl1wd1BII=');
	            var etag_string = ETag_arr.join(',');
	                
	            //执行合并
	            if(partNumber == shardCount){
	            	var Bucket = 'download';
		  		  	var Key = 'test123.jpg';
		  		  	var METHOD = 'POST';
		  		  	var Header = {};
		  		    Header['Content-Type'] = content_type;
		  		  
		            var auth = getAuth(Bucket,Key,METHOD,Header);
		            
	            	//ajax提交内容
	                $.ajax({
				  		url:'http://'+Bucket+'.ufile.ucloud.cn/'+Key+'?uploadId='+UploadId+'&newKey=hahaha.jpg',
				  		type:"post",
				  		processData: false,
				  		async: false,
				  		data:etag_string,
				  		headers: {
				            "Authorization":auth,
				            "Content-Type": content_type
				        },
				  		success: function (response) {
				            console.log(response);
				        }
			  		});
	            }
	        }
	    };
	    $(function(){
	        page.init();
	    });


文件打包下载 http://www.dayanmei.com/download.php?filename=ucloud_ufile_javascript.zip

  • 你可能对这些文章感兴趣