thinkphp OSS服务器签名直传

<?php
//函数库
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";
}

function oss_qianming(){
    $id= 'XXX';
    $key= 'XXX';
    $host = 'http://XXX.oss-cn-beijing.aliyuncs.com';

    $now = time();
    $expire = 30; //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问
    $end = $now + $expire;
    $expiration = gmt_iso8601($end);

    $dir = 'upload/'. date("Ymd",time()) .'/';

    //最大文件大小.用户可以自己设置
    $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);
    //echo json_encode($arr);
    //return;
    $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));

    $response = array();
    $response['accessid'] = $id;
    $response['host'] = $host;
    $response['policy'] = $base64_policy;
    $response['signature'] = $signature;
    $response['expire'] = $end;
    //这个参数是设置用户上传指定的前缀
    $response['dir'] = $dir;
    return $response;
}






    
    //控制器
    public function edit($id)
    {
        $taoxi = $this->taoxi_model->find($id);
        $oss_qianming = oss_qianming();

        return $this->fetch('edit', ['taoxi' => $taoxi, 'oss_qianming' => $oss_qianming]);
    }


?>


<!--
edit.html
-->
<div class="layui-form-item">
    <label class="layui-form-label">套系视频</label>
    <div class="layui-input-block">
        <input type="text" name="video" value="{$taoxi.video}" class="layui-input">
    </div>
    <div class="layui-input-block">
        <a id="up_video_box_file" href="javascript:void(0);" class='layui-btn'>选择文件</a>
        <div id="up_video_box_msg" style="line-height:40px;"></div>
    </div>
</div>


<script>
var policy = '{$oss_qianming.policy}';
var signature = '{$oss_qianming.signature}';
var dir = '{$oss_qianming.dir}';
oss_zhichuan('up_audio_box_file','up_audio_box_msg','audio');


accessid= 'XXX';
host = 'http://XXX.oss-cn-beijing.aliyuncs.com';

/**
 * OSS直传
 * @param file_btn  上传按钮
 * @param msg       上传文件信息
 * @param file_ipt  储存上传文件path的input
 * @return 
 */
function oss_zhichuan(file_btn,msg_div,file_ipt)
{
var uploader = new plupload.Uploader({
    runtimes : 'html5,flash,silverlight,html4',
    browse_button : file_btn, 
    flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',
    silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',
    multi_selection : false,//设置不允许一次上传多个
    url : host,
    multipart_params: {
        'Filename': '${filename}', 
        'key' : dir+'${filename}',
        'policy': policy,
        'OSSAccessKeyId': accessid, 
        'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
        'signature': signature,
    },
    init: {
        FilesAdded: function(up, files) {

            plupload.each(files, function(file) {
                //document.getElementById('ossfile').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ')<b></b>'
                //+'<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
                //+'</div>';
                document.getElementById(msg_div).innerHTML = '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ')<b></b>'
                +'<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
                +'</div>';

                previewImage(file,function(imgsrc){
                    $('#'+file.id).append('<img src="'+ imgsrc +'" />');
                })

            });


            uploader.start();

        },
        UploadProgress: function(up, file) {
            var d = document.getElementById(file.id);
            d.getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
            
            var prog = d.getElementsByTagName('div')[0];
            var progBar = prog.getElementsByTagName('div')[0]
            progBar.style.width= 2*file.percent+'px';
            progBar.setAttribute('aria-valuenow', file.percent);
        },
        FileUploaded: function(up, file, info) {
            if (info.status >= 200 || info.status < 200)
            {
                document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '上传成功!';
                
                var name = dir+file.name;
                $("input[name='"+file_ipt+"']").val(name);
            }
            else
            {
                document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
            } 
        },
        Error: function(up, err) {
            document.getElementById('console').appendChild(document.createTextNode("\nError xml:" + err.response));
        }
    }
});
uploader.init();
}

    //plupload中为我们提供了mOxie对象
    //有关mOxie的介绍和说明请看:https://github.com/moxiecode/moxie/wiki/API
    //如果你不想了解那么多的话,那就照抄本示例的代码来得到预览的图片吧
    function previewImage(file,callback){//file为plupload事件监听函数参数中的file对象,callback为预览图片准备完成的回调函数
        if(!file || !/image\//.test(file.type)) return; //确保文件是图片
        if(file.type=='image/gif'){//gif使用FileReader进行预览,因为mOxie.Image只支持jpg和png
            var fr = new mOxie.FileReader();
            fr.onload = function(){
                callback(fr.result);
                fr.destroy();
                fr = null;
            }
            fr.readAsDataURL(file.getSource());
        }else{
            var preloader = new mOxie.Image();
            preloader.onload = function() {
                preloader.downsize( 300, 300 );//先压缩一下要预览的图片,宽300,高300
                var imgsrc = preloader.type=='image/jpeg' ? preloader.getAsDataURL('image/jpeg',80) : preloader.getAsDataURL(); //得到图片src,实质为一个base64编码的数据
                callback && callback(imgsrc); //callback传入的参数为预览图片的url
                preloader.destroy();
                preloader = null;
            };
            preloader.load( file.getSource() );
        }   
    }


</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值