tp5实现阿里云oss的web直传及实时进度显示

TP5实现阿里云oss上传 在项目根目录 用composer下载oss-sdk-phpcomposer require aliyuncs/oss-sdk-php 参考:https://help.aliyun.com/document_detail/85580.html 在config文件里配置账户信息 return [ 'oss' =>[ 'accessKe... 阅读详情

对于大文件上传时使用阿里云oss的web直传可谓是舒服至极,速度快,编写方便。

整体来看该功能我将其分为三个部分:后端签名和回调接口、前端html、文档内的js文件下载;话不多说直接帖代码,看完代码我将会指出期间本人遇到的坑及解决方法。

后端签名接口:

protected $accessKeyId = '';		// Access Key ID
    protected $accessKeySecret = '';	// Access Key Secret
    protected $endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';	// 阿里云oss 固定的 外网地址endpoint
    protected $bucket = '';			// Bucket名称

    public function getWebToOssSignature()
    {
//        if (empty($name))
//            return json(['code'=>-1,'data'=>'','msg'=>'非法请求']);
        $id= $this->accessKeyId;          // 请填写您的AccessKeyId。
        $key= $this->accessKeySecret;     // 请填写您的AccessKeySecret。
        // $host的格式为 bucketname.endpoint,请替换为您的真实信息。
        $host = 'http://wanzufile.oss-cn-hangzhou.aliyuncs.com';
        // $callbackUrl为上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实URL信息。
        $callbackUrl = config('host').'/callback';
        $dir = '';          // 用户上传文件时指定的前缀。

        $callback_param = array('callbackUrl'=>$callbackUrl,
            'callbackBody'=>'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
            'callbackBodyType'=>"application/x-www-form-urlencoded");
        $callback_string = json_encode($callback_param);

        $base64_callback_body = base64_encode($callback_string);
        $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));

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

    private 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";
    }

后端回调接口:

public function ossUploadCallback()
    {
        $authorizationBase64 = "";
        $pubKeyUrlBase64 = "";
        if (isset($_SERVER['HTTP_AUTHORIZATION']))
        {
            $authorizationBase64 = $_SERVER['HTTP_AUTHORIZATION'];
        }
        if (isset($_SERVER['HTTP_X_OSS_PUB_KEY_URL']))
        {
            $pubKeyUrlBase64 = $_SERVER['HTTP_X_OSS_PUB_KEY_URL'];
        }

        if ($authorizationBase64 == '' || $pubKeyUrlBase64 == '')
        {
            header("http/1.1 403 Forbidden");
            exit();
        }

        // 2.获取OSS的签名
        $authorization = base64_decode($authorizationBase64);

        // 3.获取公钥
        $pubKeyUrl = base64_decode($pubKeyUrlBase64);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $pubKeyUrl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        $pubKey = curl_exec($ch);
        if ($pubKey == "")
        {
            //header("http/1.1 403 Forbidden");
            exit();
        }

        // 4.获取回调body
        $body = file_get_contents('php://input');

        // 5.拼接待签名字符串
        $authStr = '';
        $path = $_SERVER['REQUEST_URI'];
        $pos = strpos($path, '?');
        if ($pos === false)
        {
            $authStr = urldecode($path)."\n".$body;
        } else
        {
            $authStr = urldecode(substr($path, 0, $pos)).substr($path, $pos, strlen($path) - $pos)."\n".$body;
        }

        // 6.验证签名
        $ok = openssl_verify($authStr, $authorization, $pubKey, OPENSSL_ALGO_MD5);
        if ($ok == 1)
        {
            header("Content-Type: application/json");
            $data = array("Status"=>"Ok");
            echo json_encode($data);
        } else
        {
            //header("http/1.1 403 Forbidden");
            exit();
        }
        exit();
    }

本人前端的html(这段svg特效也是借鉴网上大神的仅做了小小的修改):

<style>
        .box {
            height: 50px;
            width: 50px;
            position: relative;
            top: 25px;
            left: 50%;
            -webkit-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
            background: #020438;
            border-radius: 100%;
            overflow: hidden;
        }
        .box .percent {
            position: absolute;
            left: 0;
            top: 0;
            z-index: 3;
            width: 100%;
            height: 100%;
            display: flex;
            display: -webkit-flex;
            align-items: center;
            justify-content: center;
            color: #fff;
            font-size: 14px;
        }
        .box .water {
            position: absolute;
            left: 0;
            top: 0;
            z-index: 2;
            width: 100%;
            height: 100%;
            -webkit-transform: translate(0, 100%);
            transform: translate(0, 100%);
            background: #4D6DE3;
            transition: all .3s;
        }
        .box .water_wave {
            width: 200%;
            position: absolute;
            bottom: 100%;
        }
        .box .water_wave_back {
            right: 0;
            fill: #C7EEFF;
            -webkit-animation: wave-back 1.4s infinite linear;
            animation: wave-back 1.4s infinite linear;
        }
        .box .water_wave_front {
            left: 0;
            fill: #4D6DE3;
            margin-bottom: -1px;
            -webkit-animation: wave-front .7s infinite linear;
            animation: wave-front .7s infinite linear;
        }

        @-webkit-keyframes wave-front {
            100% {
                -webkit-transform: translate(-50%, 0);
                transform: translate(-50%, 0);
            }
        }

        @keyframes wave-front {
            100% {
                -webkit-transform: translate(-50%, 0);
                transform: translate(-50%, 0);
            }
        }
        @-webkit-keyframes wave-back {
            100% {
                -webkit-transform: translate(50%, 0);
                transform: translate(50%, 0);
            }
        }
        @keyframes wave-back {
            100% {
                -webkit-transform: translate(50%, 0);
                transform: translate(50%, 0);
            }
        }
    </style>


<div class="ed-list-three" id="container">
            <span>相关视频</span>
            <button type="button" class="layui-btn layui-btn-normal" id="video"><i class="layui-icon"></i>选择视频</button>
            <div class="layui-inline">
                <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" style="display: none;">
                    <symbol id="wave">
                        <path d="M420,20c21.5-0.4,38.8-2.5,51.1-4.5c13.4-2.2,26.5-5.2,27.3-5.4C514,6.5,518,4.7,528.5,2.7c7.1-1.3,17.9-2.8,31.5-2.7c0,0,0,0,0,0v20H420z"></path>
                        <path d="M420,20c-21.5-0.4-38.8-2.5-51.1-4.5c-13.4-2.2-26.5-5.2-27.3-5.4C326,6.5,322,4.7,311.5,2.7C304.3,1.4,293.6-0.1,280,0c0,0,0,0,0,0v20H420z"></path>
                        <path d="M140,20c21.5-0.4,38.8-2.5,51.1-4.5c13.4-2.2,26.5-5.2,27.3-5.4C234,6.5,238,4.7,248.5,2.7c7.1-1.3,17.9-2.8,31.5-2.7c0,0,0,0,0,0v20H140z"></path>
                        <path d="M140,20c-21.5-0.4-38.8-2.5-51.1-4.5c-13.4-2.2-26.5-5.2-27.3-5.4C46,6.5,42,4.7,31.5,2.7C24.3,1.4,13.6-0.1,0,0c0,0,0,0,0,0l0,20H140z"></path>
                    </symbol>
                </svg>
                <div class="box">
                    <div class="percent">
                        <div class="percentNum" id="count">0</div>
                        <div class="percentB" id="">%</div>
                    </div>
                    <div id="water" class="water">
                        <svg viewBox="0 0 560 20" class="water_wave water_wave_back">
                            <use xlink:href="#wave"></use>
                        </svg>
                        <svg viewBox="0 0 560 20" class="water_wave water_wave_front">
                            <use xlink:href="#wave"></use>
                        </svg>
                    </div>
                </div>
            </div>
            <div class="layui-inline">
                <div style="width: 747px;">
                    <input type="text" id="url" name="video" lay-verify="url" placeholder="输入视频地址或点击上传视频" autocomplete="off" class="layui-input">
                </div>
            </div>
        </div>

文档内下载的js文件并更改相关配置秩序在html内引入该js即可:

var accessid = '';
var accesskey = '';
var host = '';
var policyBase64 = '';
var signature = '';
var callbackbody = '';
var filename = '';
var key = '';
var expire = 0;
var g_object_name = '';
var g_object_name_type = '';
var now = timestamp = Date.parse(new Date()) / 1000;
var status = false;

function send_request()
{
    var xmlhttp = null;
    if (window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    if (xmlhttp!=null)
    {
        // serverUrl是 用户获取 '签名和Policy' 等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
        // serverUrl = 'http://88.88.88.88:8888/aliyun-oss-appserver-php/php/get.php'
        var serverUrl = '自己的回调地址';

        xmlhttp.open( "GET", serverUrl, false );
        xmlhttp.send( null );
        return xmlhttp.responseText
    }
    else
    {
        alert("Your browser does not support XMLHTTP.");
    }
}

function check_object_radio() {
    g_object_name_type = 'random_name';
}

function get_signature()
{
    // 可以判断当前expire是否超过了当前时间, 如果超过了当前时间, 就重新取一下,3s 作为缓冲。
    now = timestamp = Date.parse(new Date()) / 1000;
    if (expire < now + 3)
    {
        body = send_request();
        var obj = eval ("(" + body + ")");
        host = obj['host'];
        policyBase64 = obj['policy'];
        accessid = obj['accessid'];
        signature = obj['signature'];
        expire = parseInt(obj['expire']);
        callbackbody = obj['callback'];
        key = obj['dir'];
        return true;
    }
    return false;
};

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) {
    pos = filename.lastIndexOf('.');
    suffix = '';
    if (pos != -1) {
        suffix = filename.substring(pos)
    }
    return suffix;
}

function calculate_object_name(filename)
{
    if (g_object_name_type == 'local_name')
    {
        g_object_name += "${filename}"
    }
    else if (g_object_name_type == 'random_name')
    {
        suffix = get_suffix(filename)
        g_object_name = key + random_string(10) + suffix
    }
    return ''
}

function get_uploaded_object_name(filename)
{
    if (g_object_name_type == 'local_name')
    {
        tmp_name = g_object_name;
        tmp_name = tmp_name.replace("${filename}", filename);
        return tmp_name
    }
    else if(g_object_name_type == 'random_name')
    {
        return g_object_name
    }
}

function set_upload_param(up, filename, ret)
{
    if (ret == false)
    {
        ret = get_signature()
    }
    g_object_name = key;
    if (filename != '') { suffix = get_suffix(filename)
        calculate_object_name(filename)
    }
    var new_multipart_params = {
        'key' : g_object_name,
        'policy': policyBase64,
        'OSSAccessKeyId': accessid,
        'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
        'callback' : callbackbody,
        'signature': signature,
    };

    up.setOption({
        'url': host,
        'multipart_params': new_multipart_params
    });

    up.start();
}

var uploader = new plupload.Uploader({
    runtimes : 'html5,flash,silverlight,html4',
    browse_button : 'video',
    multi_selection: false,
    // container: document.getElementById('container'),
    flash_swf_url : '__JS__/lib/Moxie.swf',
    silverlight_xap_url : '__JS__/lib/Moxie.xap',
    url : 'http://oss.aliyuncs.com',

    filters: {
        mime_types : [ //允许上传文件格式
            { title : "Video files", extensions : "mp4" },
            { title : "Audio files", extensions : "mp3" }
        ],
        max_file_size : '2048mb', //最大只能上传10mb的文件
        prevent_duplicates : true //不允许选取重复文件
    },

    init: {
        PostInit: function() {
        },

        FilesAdded: function(up, files) {
            plupload.each(files, function(file) {
                set_upload_param(uploader, '', false);
                // layer.load(1);
                return false;
            });
        },

        BeforeUpload: function(up, file) {
            check_object_radio();
            set_upload_param(up, file.name, true);
        },

        UploadProgress: function(up, file) {
            // 实时的进度条效果再此处实现
            $('#count').text(file.percent);
            $('#water').css('transform','translate(0' + ',' + (100 - file.percent) + '%)');
            // if (file.percent == 100)
                // layer.closeAll();
        },

        FileUploaded: function(up, file, info) {
            if (info.status == 200)
            {
                layer.msg('上传成功');
                let name = '阿里云地址'+get_uploaded_object_name(file.name);
                // name = '<video src="' + name + '" controls="controls"></video>';
                $('#url').val(name);//赋值到input表单
                // document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name) + ' 回调服务器返回的内容是:' + info.response;
            } else if (info.status == 203) {
                layer.msg('文件上传成功啦');
                let name = '阿里云地址'+get_uploaded_object_name(file.name);
                $('#url').val(name);//赋值到input表单
                // document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '上传到OSS成功,但是oss访问用户设置的上传回调服务器失败,失败原因是:' + info.response;
            } else {
                // document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
            }
        },

        Error: function(up, err) {
            var txt = '';
            if (err.code == -600) {
                txt = '选择的文件太大了,可以根据应用情况,在upload.js 设置一下上传的最大大小';
            } else if (err.code == -601) {
                txt = '选择的文件后缀不对,可以根据应用情况,在upload.js进行设置可允许的上传文件类型';
            } else if (err.code == -602) {
                txt = '这个文件已经上传过一遍了';
            } else {
                txt = "Error xml:" + err.response;
            }
            layer.msg(txt);
        }
    }
});

uploader.init();

上述所有代码仅需复制即可实现如下图的效果:(当然html中还需要引入jquery和layer文件)

与此同时你可能会遇到的问题就是你的回调问题,文件上传成功了但是却一直提示回调设置失败如下图:

解决方法就是修改tp入口文件中的.htaccess文件新增以下几行代码即可:

 RewriteEngine on
  RewriteCond %{HTTP:Authorization} .
  RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

上传文件大小的限制这个需要注意的有两个地方: 第一个是官网给出最大上传文件大小限制为5G,第二个就是自己设置文件大小时要注意上面一点的同时要保证前后台设置的文件大小限制一致。设置位置截图如下:

(服务端)

 (客户端)

不一致的情况下不一定会报错。为什么是不一定呢?本人真实遇到的情况是客户端设置了4.5G的上传限制而客户端只设置了1G的上传限制导致前端上传进度显示100%但是最终无法获取上传成功后的文件地址,并在一段时间后提示错误(如下图)。结论就是上传文件限制根据客户端或服务的设置的值取最小的,因此本人建议设置一致:

最后一点注意就是回调地址的路由定义时一定要用post方式;

欢迎各位铁汁提出您的宝贵意见。

服务端获取签名前端直传oss插件layui-aliossUploader-master.zip 服务端获取签名前端直传oss插件资源,这个插件是大佬上传到layui上了,资源里面有他的github地址,我写的博客记录一下如何是使用这个插件以及如何服务端获取签名前端直传oss 立即下载

相关推荐

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3330

阿里云CDN/OSS入门使用到实战

CDN原理介绍阿里云CDN的开通以及使用CDN实战博客网站加速OSS后台使用配置api文件上传分片上传web直传到OSS

MES系统领料申请、出库、确认到料各环节的处理

在WMS和MES系统协同的车间管理中,核心分工原则为:MES负责生产需求发起(领料申请)和结果确认(到料验收),WMS执行库存管理和物流作业。具体流程为:1)MES根据生产需求生成领料单推送至WMS;2)WMS完成拣货出库并调度AGV配送;3)车间在MES确认到料后解锁生产工序。系统边界严格限定:MES不参与库存/库位管理,WMS不干预生产决策。特殊场景(紧急补料、缺料异常等)通过标准化接口流程处理,确保生产与物流高效协同的同时保持账实一致。

做有价值的事,积累有价值的笔记! 585

如何通过Web端直传文件(Object)到OSS

Web端上传OSS介绍 用户在浏览器或App端上传文件到应用服务器,应用服务器再把文件上传到OSS。具体流程如下图所示。 和数据直传到OSS相比,以上方法存在以下缺点: 上传慢:用户数据需先上传到应用服务器,之后再上传到OSS,网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。 扩展性差:如果后续用户数量逐渐增加,则应用服务器会成为瓶颈。 费用高:需要准备多台应用服务器。由于OSS上行流量

mukang 1158

【SAP PO】SAP PO 接口配置完整教程之二REST服务对接

SAP PO 接口配置完整教程之二REST服务对接

XLevon的博客 1万+

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

阿里云: web如何直传oss & 常见问题 & oss图片的常用处理

阿里云web直传&oss图片显示处理

qq_38969618的博客 5383

Python 爬虫反爬突破:浏览器指纹深度伪装技术

在当前网络安全与反爬虫技术日趋成熟的环境下,传统的请求头伪装、IP 代理已无法满足复杂站点的爬虫需求。浏览器指纹作为网站识别爬虫、区分真实用户与自动化程序的核心技术,成为爬虫进阶必须突破的关键壁垒。浏览器指纹通过采集浏览器环境、硬件信息、渲染特性等多维数据生成唯一标识,即使更换 IP、清除 Cookie,网站仍可精准识别爬虫程序。本文聚焦浏览器指纹深度伪装技术,从指纹生成原理、核心指纹类型、Python 实现方案、高匿伪装实战到风控绕过策略,全方位讲解浏览器指纹的突破方法。Selenium 官方文档。

2503_91057718的博客 640

Thinkphp-商城项目之oss文件上传及web端直传

一般商城网站都会把文件上传到第三方云,例如阿里云(oss),腾讯云(cos),当然如果公司有足够的实力,可以自己部署一台文件服务器,用于文件的保存。

gzmyh的博客 946

用 DCL 编写 DEFINE ROLE:把 ABAP CDS 的访问控制做对、做实、做漂亮

摘要: 本文详细讲解如何在ABAP CDS中使用DCL(数据控制语言)实现行级授权,确保业务数据安全。核心要点包括: DCL原理:通过DEFINE ROLE将访问条件绑定到CDS实体,自动附加到查询条件(类似隐式WHERE),保障授权一致性。 关键语法: 必需注解@MappingRole: true声明映射角色。 ASPECT pfcg_auth关联PFCG权限对象,动态控制访问。 注解@AccessControl.authorizationCheck定义授权检查策略(如#CHECK启用强制控制)。 优先级

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 166

OpenClaw Skill 开发全攻略|2026 最新机制 + 文件处理实操,看完直接落地开发

很多新手刚接触时,会把 Skill 想得很复杂,其实大可不必。OpenClaw 中的每个 Skill,本质就是一套“能力描述 + 执行逻辑”的组合包,简单说就是“告诉 AI 你能做什么、怎么做,它就会调用你”,核心特征可以总结为这几点,好记又实用:核心载体:以文件夹为单位,不管多简单的 Skill,文件夹里都必须有 SKILL.md 文件——这是 AI 识别技能的唯一依据,少了它,再完善的代码也没用;

haolove527的专栏 7027

web直接上传oss_Web端文件上传至阿里云OSS(基于Angular 5项目)

一、准备工作1. 开通阿里云OSS效劳,从掌握台上猎取AccessKeyId和AccessKeySecret。2. 建立Bucket,并登录OSS掌握台3. 设置Bucket将allowed origins(泉源)设置成 *将allowed methods(许可methods)设置成 PUT, GET, POST, DELETE, HEAD将allowed headers(许可headers)设置...

weixin_39556891的博客 480

MySQL 一一 MySQL基本使用

1、数据库 简单来说,所谓的数据库就是存储数据的容器,而且是永久存储的。 2、为什么需要数据库 3、为什么要学习MySQL数据库 最早MySQL数据,瑞典AB公司开发的一款开源型的关系型数据库。 随着时间的推移,瑞典AB公司把MySQL数据库转让给Sun公司(Java语言的创始公司) 后来,Sun公司经营不善,又把MySQL数据库转让给甲骨文公司(Oracle数据库) 4、数

Guizy 7万+

TP 网盘源码深度解析:私有化部署你的「图床 + 网盘」系统(附架构图与部署流程)

这套 TP 网盘源码的价值,在于用一套不复杂的 PHP 架构,把"网盘 + 图床 + 外链 + 变现"四个需求打包解决了,且通过多云存储把数据自主权交还给使用者。对想自建资源站、图床或做 PHP 实战学习的开发者,是一份不错的参考与二次开发底子。实操小贴士:部署最容易卡在「伪静态 + 目录权限 + 云存储 AK 配置」三步。建议先在本地用本地存储跑通全流程,再切云存储。需要一份更细的「部署 Checklist(含 Nginx 配置与排错表)」?欢迎在评论区留言,我整理好分享给你。

青狐博客 372

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

阿里云OSS-小程序文件直传(支持微信小程序、H5、PC端web使用)

支持微信小程序、H5、PC端web使用,整套文件进行封装统一使用开发背景:做类似发布朋友圈的功能需求,由于后端对发布功能只提供一个接口,文字、状态、文件上传统一一个接口上传,且对文件上传方面做的接口存在诸多问题(人已经整麻了),包括各种数据结构的转换迎合后端,为节省时间和甩锅,被迫从客户端直传阿里云服务器,绕开服务端进行文件上传等操作,中间base64处理、加密策略,计算签名等处理都在前端完成。优点:减少服务器压力缺点:客户端目前不能直接预览文件,还需进一步在客户端处理(还在研究中)

cashAAone的博客 5303

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

阿里云OSS web端直传 不依赖官方pupload的插件

前言 做好了七牛云存储,又要换阿里云oss。。。记录一下过程。 本次采用的是服务端生成签名。web端直传的方式。没设置回调(jq的ajax) 一、准备工作 浏览使用手册: 阿里云oss使用文档 几个关键的手册页面: 1、服务端签名后直传 2、php代码示例 3、PostObject API 说明 二、原理 1、用户发送上传Policy请求到应用服务器。 2、应用服务器返回上传Policy和签名...

qq_41674202的博客 552

web直传阿里OSS

直传阿里oss

qq_44309969的博客 833

文件上传到OSS,显示进度条信息

/ e.loaded 已传输的字节。// e.total 需传输的总字节。

qq_41555989的博客 694

OSS文件上传(页面直传)

【前言】 近段时间在写一个文件上传的小功能,,公司的老项目实际已经有上传功能,,但是经理说在上传大文件的时候失败几率很大,,于是就仔仔细细的看了下老系统的文件上传的写法,在看了其写法之后决定重新整理一下。 因为使用的是阿里的OSS文件存储服务,所以去看了阿里的官方文档 OSS文档 ,然后着手去开发一个新模式的OSS文件上传。 OSS上传文件的三种模式 1.web端直传 Web端常见的上传...

林小易的博文 1万+

web直传oss之大文件上传,切片上传,断点续传

本人菜鸟一个,大神轻喷。。。偶感瓶颈与今日起开始记录平时项目中的难题以及平时的心得。 最近项目中刚好有让前端单独直接接入阿里的SDK实现web直传oss的功能。废话不多说直接官方文档看一下,弥补一下我的未知世界,发现文档还是比较好理解的。 这里贴下官网的代码片段 https://help.aliyun.com/document_detail/64047.html?spm=a2c...

死亡循环 3086

阿里云OSS云存储-上传文件进度显示与效率提升之路

基于阿里云OSS云存储实现上传文件的进度显示与上传速度的效率提升

weixin_35947769的博客 706

前端实现阿里云oss直传 进度条

前端实现阿里云oss上传 桶内跨域配置 实例化 const OSS = require('ali-oss') const client = new OSS({ region: 'oss-cn-beijing', // oss存储地域 accessKeyId: '入口id', // 入口id accessKeySecret: '秘钥', // 秘钥 bucket: 'hrdemo', // 存储通 secure: true }) 上传代码 // img 文件夹下 obj.file.

greed 4540

php(TP5)实现上传到阿里云OSS

php(TP5)实现上传到阿里云OSS

success_a的博客 3743

tp5上传图片到阿里云oss

tp5 上传图片到阿里云oss

admincg的博客 626

TP5上传文件到OSS

第一步:下载sdk 下载地址:https://github.com/aliyun/aliyun-oss-php-sdk?spm=a2c4g.11186623.2.9.451233bc4YHDp...

qq_42129925的博客 1242

上传阿里云OSS之最佳实践方案(WEB直传)

最近在开发过程中遇到一个难解的问题:批量上传到存储空间OSS的时候,发现上传速度非常慢,比如说某些文件管理系统这种批量上传的时候对于上传的速度是非常重要的。 1、什么是OSS? 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。您可以通过本文档提供的简单的REST接口,在任何时间、任何地点、任何互联网设备上进行上传和下载数据。基于OSS,您可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。 其

weixin_42482020的博客 2645
上一篇: MySQL优化之慢查询
下一篇: 详解自定义钉钉机器人推送消息(一) PHP篇
一只小béi
博客等级 码龄9年 15粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值