当前位置: 首页 > news >正文

oss web直传

签名信息

auth.php

<?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";
}
//阿里云官方提供的秘钥
$id= '6MKOqxGiGU4AUk44';
$key= 'ufu7nS8kS59awNihtjSonMETLI0KLy';
$host = 'http://post-test.oss-cn-hangzhou.aliyuncs.com';

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

$dir = 'user-dir/';

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

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

$response['code']=1;

echo json_encode(['data'=>$response,'status'=>1]);

web端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>

<div>
    <input type="hidden"  > <img src="" style="width: 200px;height: 100px; display: none">
    <input type="file" name="upfile" accept="image/*" >
</div>


<script type="text/javascript">
    var expire =0;
     sign_obj='';
    var serverUrl='auth.php';
    $(function () {
        $("div").on("change",'input[type="file"]',function(evt){
            $this=$(this);
            var files = evt.target.files;
            var file=files[0];
            if(file.size > 10*1024*1024 ){
                alert('too big');
                return false;
            }
            get_signature();
            if(sign_obj == '') {
                alert(sign_obj);
               alert('签名error,请重试');
                return false;
            }

            var g_object_name=sign_obj.dir+random_string()+get_suffix(file.name);
            var request = new FormData();
            request.append("OSSAccessKeyId",sign_obj.accessid);//Bucket 拥有者的Access Key Id。
            request.append("policy",sign_obj.policy);//policy规定了请求的表单域的合法性
            request.append("Signature",sign_obj.signature);//根据Access Key Secret和policy计算的签名信息,OSS验证该签名信息从而验证该Post请求的合法性
            request.append("key",g_object_name);//文件名字,可设置路径
            request.append("success_action_status",'200');// 让服务端返回200,不然,默认会返回204
            request.append('x-oss-object-acl', 'public-read');
            request.append('file', file);
            $.ajax({
                url : sign_obj.host,  //上传阿里地址
                data : request,
                processData: false,//默认true,设置为 false,不需要进行序列化处理
                cache: false,//设置为false将不会从浏览器缓存中加载请求信息
                async: false,//发送同步请求
                contentType: false,//避免服务器不能正常解析文件---------具体的可以查下这些参数的含义
                dataType: 'xml',//不涉及跨域  写json即可
                type : 'post',
                success : function(callbackHost, request) {     //callbackHost:success,request中就是 回调的一些信息,包括状态码什么的
                    var origin=sign_obj.host+'/'+g_object_name;
                    var src=origin;
                    $this.closest('div').find('img').attr('src', src).show();
                    $this.closest('div').find('.imgclose').show();
                },
                error : function(returndata) {
                    console.log("return data:"+returndata);
                    alert('上传图片出错啦,请重试')
                }
            });
        });
    })


    function random_string(len) {
        len = len || 32;
        var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
        var maxPos = chars.length;
        var pwd = '';
        for (i = 0; i < len; i++) {
            pwd += chars.charAt(Math.floor(Math.random() * maxPos));
        }
        return pwd;
    }

    function get_suffix(filename) {
        var pos = filename.lastIndexOf('.')
        var suffix = ''
        if (pos != -1) {
            suffix = filename.substring(pos)
        }
        return suffix;
    }
    //获取签名信息
    function send_request()
    {
        var xmlhttp = null;
        if (window.XMLHttpRequest)
        {
            xmlhttp=new XMLHttpRequest();
        }
        else if (window.ActiveXObject)
        {
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        if (xmlhttp!=null)
        {
            xmlhttp.open( "GET", serverUrl, false );
            xmlhttp.send( null );
            return xmlhttp.responseText
        }
        else
        {
            alert("Your browser does not support XMLHTTP.");
        }
    }

    function get_signature()
    {
        //可以判断当前expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲
        now = timestamp = Date.parse(new Date()) / 1000;
        if (expire < now + 3)
        {
            var body = send_request();
            var obj =JSON.parse(body);
            if(obj.status ==1  && obj.data.code == 1){
                sign_obj= obj.data;
                expire= parseInt(sign_obj['expire']);
                return true;
            }

            return true;
        }
        return false;
    };


</script>

</body>
</html>

 

转载于:https://www.cnblogs.com/HKUI/p/8289048.html

相关文章:

  • dd-wrt达到300Mbps的关键设置
  • 跨域
  • [转载] 考试经验——2011下半年信息系统项目管理师论文52分者谈论文写作经验...
  • 『TensorFlow』TFR数据预处理探究以及框架搭建
  • shell开发基础:准备100万条测试数据在MYSQL中
  • 十个生成模型(GANs)的最佳案例和原理 | 代码+论文
  • Linux中如何让进程(或正在运行的程序)到后台运行?[zz]
  • Spring Boot快速入门(一):Hello Spring Boot
  • 一致性hash
  • LabView和DLL中的参数问题
  • Oracle高级复制
  • 浅谈回归(二)——Regression 之历史错误翻译
  • JS判断浏览器类型和屏幕分辨率来调用不同的CSS样式
  • CentOS 6.7 如何启用中文输入法
  • Citrix XenDesktop 引发的学案(四)-与“您的虚拟桌面”之间的连接失败,状态(1030)...
  • ES6指北【2】—— 箭头函数
  • 分享的文章《人生如棋》
  • 时间复杂度分析经典问题——最大子序列和
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【刷算法】从上往下打印二叉树
  • CSS实用技巧
  • Github访问慢解决办法
  • IP路由与转发
  • Less 日常用法
  • LintCode 31. partitionArray 数组划分
  • Map集合、散列表、红黑树介绍
  • Promise面试题,控制异步流程
  • Rancher如何对接Ceph-RBD块存储
  • vue2.0项目引入element-ui
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 高程读书笔记 第六章 面向对象程序设计
  • 机器学习 vs. 深度学习
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 码农张的Bug人生 - 初来乍到
  • 前端设计模式
  • 悄悄地说一个bug
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 网络应用优化——时延与带宽
  • 阿里云ACE认证学习知识点梳理
  • 如何正确理解,内页权重高于首页?
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (6)设计一个TimeMap
  • (function(){})()的分步解析
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (蓝桥杯每日一题)love
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)程序员疫苗:代码注入
  • .htaccess配置重写url引擎