首页 > 编程语言 >Javascript上传文件到阿里OSS存储,并支持进度查看

Javascript上传文件到阿里OSS存储,并支持进度查看

时间:2023-05-30 18:23:29浏览次数:61  
标签:evt OSS Javascript callback fd policy 上传 response

现在使用js上传文件的插件有很多,例如:plupload等等

今天我记录一下使用原生js的上传文件,并且支持进度查看,下面直接上代码:

html代码:

<input type="file" onchange="uploadMedia(this)">
<a id="showProgress" style="display:none;" href="#"></a>

预览效果:

 javascript代码:

function uploadMedia(_this) {
        var $this= _this;
        document.getElementById("showProgress").style.display="inline-block";

        var xhr = new XMLHttpRequest();

        //上传进度
        xhr.upload.addEventListener("progress", function(evt){
            //console.log(evt);
            if (evt.lengthComputable) {
                //上传中设置上传的百分比
                var percentComplete = Math.round(evt.loaded * 100 / evt.total);
                if (percentComplete == 100) {
                    setTimeout(function () {
                        document.getElementById("showProgress").innerHTML = '已上传'+percentComplete+"%";
                    }, 500)
                } else {
                    document.getElementById("showProgress").innerHTML = '已上传'+percentComplete+"%";
                }
            } else {
                document.getElementById("showProgress").innerHTML = '无法计算';
            }
        }, false);

        //请求完成后执行的操作
        xhr.addEventListener("load", function(evt){
            var message = evt.target.responseText;
                obj = eval("("+message+")");
            alert('上传成功,地址为:'+obj.data.filename);
        }, false);

        //请求error
        xhr.addEventListener("error", uploadFailed, false);

        //请求中断
        xhr.addEventListener("abort", uploadCanceled, false);

        //参数转json
        var dataObj = JSON.parse(data);

        //设置请求参数
        var fd = new FormData();
        fd.append("OSSAccessKeyId", dataObj.OSSAccessKeyId);
        fd.append("Signature", dataObj.Signature);
        fd.append("callback", dataObj.callback);
        fd.append("expire", dataObj.expire);
        fd.append("key", dataObj.key);
        fd.append("name", $this.files[0].name);
        fd.append("policy", dataObj.policy);
        fd.append("file", $this.files[0]);

        //发送请求
        xhr.open("POST", 'https://'+dataObj.host);

        //发送数据
        xhr.send(fd);
    }

    function uploadFailed(evt) {
        alert("上传出错.");
    }

    function uploadCanceled(evt) {
        alert("上传已由用户或浏览器取消删除连接.");
    }

测试效果:

这里说明一下data的数据来源,因为我是使用的阿里OSS服务,先贴个demo数据看看

 其中name和file参数是js获取的文件对象里面的

贴下服务端的代码:

/**
* $object 为OSS上保存的文件路径和文件名,例如:media/2023/05/30/202305301747235055.mp4
*/
public function getUploadParams($object, $callbackUrl = '', $expire = 3600) { self::init(); if(!$callbackUrl){ $callbackUrl = self::$callbackUrl; } $callback_param = array( 'callbackUrl' => $callbackUrl, 'callbackBody' => 'filename=${object}&size=${size}&mimeType=${mimeType}&imageHeight=${imageInfo.height}&imageWidth=${imageInfo.width}', 'callbackBodyType' => "application/x-www-form-urlencoded" ); $callback_string = json_encode($callback_param); $base64_callback_body = base64_encode($callback_string); $now = time(); $end = $now + $expire; $expiration = self::gmt_iso8601($end); //最大文件大小.用户可以自己设置 $condition = array(0 => 'content-length-range', 1 => 0, 2 => 2684354560);//最大2.5G $conditions[] = $condition; //表示用户上传的数据,必须是以$dir开始, 不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录 $start = array(0 => 'eq', 1 => '$key', 2 => $object); $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, self::$access_secret, true)); $response = array(); $response['host'] = self::$endpoint_bucket; $response['key'] = $object; $response['OSSAccessKeyId'] = self::$access_id; $response['policy'] = $base64_policy; $response['Signature'] = $signature; $response['expire'] = $end; $response['callback'] = $base64_callback_body; return json_encode($response); } public static 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"; }

这里,我只贴了2个基础的方法,还有OSS的核心类,我没有贴出来,有兴趣的小伙伴,可以参考官方文档:https://help.aliyun.com/document_detail/31927.html?spm=a2c4g.31927.0.0.52a874ffER6VxX

 

标签:evt,OSS,Javascript,callback,fd,policy,上传,response
From: https://www.cnblogs.com/firstlady/p/17444035.html

相关文章

  • Python 执行Javascript脚本
    一、安装第三方库pipinstallPyExecJS二、创建一个js文件//test.jsfunctionadd(a,b){returna+b}三、创建一个python文件#testJs.pyimportexecjsctx=execjs.compile(open('./test.js','r',encoding='utf-8').read())print(ctx.call('add&#......
  • BOSS战-入门综合练习1
    这里将前面的内容综合起来了,会有点难,不过你可以问老师同学,也能上网查资料。P1478P1618P1579P2089......
  • git新建并上传
    总结无分支工作流程如下:克隆项目:gitcloneurl地址新增或修改项目(工作区)将新增或修改的项目添加到暂存区(gitadd.)将暂存区的项目提交到本地仓库(gitcommit-m“注释”)每次上传项目到远程仓库之前,先重新拉取项目,避免冲突(gitpull)将本地仓库文件提交到远程仓库(gitpush)—————......
  • 智能社原生的力量——原生JavaScript开发高级
    智能社原生的力量——原生JavaScript开发高级download:3w51xuebccomSpringBoot3:打造高效的Java应用程序SpringBoot是一个由Pivotal团队开发的开源框架,它基于Spring框架,旨在使Spring应用程序的开发变得更加容易和快速。最新的SpringBoot版本是3.0.0,它带来了许多新特性和功能,让我......
  • let 和 const 是 JavaScript 中用于声明变量的关键字
    let和const是JavaScript中用于声明变量的关键字。let关键字用于声明可变(可重新赋值)的变量。通过使用let关键字声明的变量可以在其作用域内被重新赋值。例如:letx=10;x=20;//可以重新赋值const关键字用于声明不可变(不可重新赋值)的常量。通过使用con......
  • web基础漏洞-文件上传漏洞
    文件上传总结–FreeBuf网络安全行业门户1、定义文件上传漏洞,是因为在网站的文件上传业务中,未严格限制上传的类型,从而导致可访问、可执行的文件被上传到服务端,访问执行后造成危害。(1)静态文件,将html、js、css等静态文件上传,可以造成xss、csrf、重定向等危害(2)脚本文件,也是最主......
  • Nginx/PHP文件上传限制说明
    0、背景说明通过PHP程序上述文件时,是否有限制取决多个因素,注意这里表述的是“是否有限制”,这里的限制不光是常认为的大小的限制,还有上传时间的限制。另外除了PHP服务本身之外,一般也和PHP上层的代理集群有关系,常见的代理集群是Nginx/Openrestry1、关于代理集群限制上传代理集......
  • 推断题(D - The BOSS Can Count Pairs)
    D-TheBOSSCanCountPairs#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"//数学题关注边界条件和推断其他的值枚举算答案//nlogn做法//https://zhuanlan.zhihu.com/p/633006114//--------------------------------------------......
  • 什么是 JavaScript 里的循环引用(circular references)
    JavaScript的循环引用(circularreferences)是指在对象之间存在相互引用的情况,形成一个闭环,导致对象无法被完全释放和垃圾回收。循环引用发生在当一个对象的属性或成员引用另一个对象,并且这个被引用的对象又直接或间接地引用回原始对象,从而形成一个循环。当存在循环引用时,JavaScrip......
  • 直播app开发搭建,Vue Element UI Upload 上传多张图片
    直播app开发搭建,VueElementUIUpload上传多张图片<template> <div>  <el-card>   <h1>轮播图-图片上传管理</h1>   <el-divider></el-divider>   <!--注意:使用:model="uploadImgForm"不要使用v-model="uploadImgForm&q......