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 立即下载

相关推荐

天线学习笔记——HFSS简单阵列天线

在HFSS15.0版本中使用 Radiation --> Antenna Array Setup 设置天线阵列的参数时的设计列表如下: 值得注意的是,在该版本中所定义的是:第一个阵元的位置坐标(First Cell Position)、阵元之间的间距(Directions)和阵元的数量(Number of Cells) 这些参数。 在ANSYS中的HFSS仿真中定义天线阵列如下: 与老版本不同的是:中心点坐标(Center Position)和布局设置(Layout Setting)。在布局设置中

Ethan的博客 1万+

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

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

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 251

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

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

mukang 1158

Notion卡顿救星:3分钟搞定DNS优化,手机电脑全平台加速指南

本文针对Notion访问慢和卡顿问题,提供了全平台DNS优化与Hosts文件修改的详细指南。通过更换优质DNS服务器或建立静态IP映射,可有效解决因网络延迟和域名解析导致的加载缓慢,实现手机与电脑端的快速加速,提升Notion使用流畅度。

v6b7n8m9q0的博客 1306

PyQt5自动化测试,让测试更加便利

PyQt5是一个Python的GUI编程工具包,帮助开发者可以更加简单、快捷地创建图形界面和处理用户输入。在PyQt5中有两种常见的测试方式:手动测试和自动化测试。手动测试需要通过点击、输入等交互操作进行测试,自动化测试则是通过程序模拟鼠标、键盘等操作进行测试。这段代码创建了一个简单的窗口,其中包含一个按钮。这段代码打开一个本地HTML文件,点击页面上的按钮并检查输出是否为“Button clicked”。以上就是在PyQt5中进行自动化测试的简单示例。使用PyQt5可以大大简化测试过程,提高测试效率。

PixelCoder的博客 710

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

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

qq_38969618的博客 5383

system.img解包打包工具

最近需要对system.img进行解包,修改系统属性和添加自己的APK,再打包烧录,整理俩个方法。 system.img解包打包工具方法一 1、把system.img转换成ext4格式 ./simg2img system.img system_ext4.img 2、挂载ext4到systemMount目录进行修改 sudo mount system_ext4.img systemMount/ -o loop 3、修改完成后 unmount 退出挂载使用如下命令

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 9705

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

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

gzmyh的博客 946

【史上最全面esp32教程】oled显示篇

esp32-arduino Oled屏幕的使用

m0_62599305的博客 1万+

Pydoll浏览器自动化框架教程

让浏览器自动化回归本质。不再纠缠驱动兼容、不再手动处理验证码、不再因为请求和 UI 分裂而头疼。如果你经常做 Web 自动化、爬虫或者测试,不妨试试 Pydoll。也别忘了给项目点个 ⭐,让作者知道有人喜欢这个工具。👉GitHub 地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 204

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

Android11原生设置屏幕亮由Gamma变化改为线性变化

从Android9 开始屏幕亮度调解变成非线性变化,这样的话就会出现 之前亮度变化很小,到后面时变化亮度很快; 修改为线性变化,只需要修改 ./frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache L

Android 4926

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

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

青狐博客 372

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

cashAAone的博客 5303

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

qq_41674202的博客 552

老版QQ原生表情gif动态

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

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、付费专栏及课程。

余额充值