js前端直传阿里云OSS,解决大文件上传限制

Nodejs后端上传文件到阿里云OSS 最近涉及到上传文件到阿里云OSS上,试过【sts临时授权】前端直传,这样只用后端返回个临时sts账号即可,服务器带宽也不用担心占用太多,虽然有时限,但是这个【sts临时授权】总感觉不是太安全,被人拿到了,期间的上传的相关记录也可以不和后端关联,那我不是冤大头吗?看其他大佬的操作也看得不是怎么看的懂。因为我当前的需求上传的量并不大,所以还是选择了安全一点的方法,完全后端上传。 阅读详情

使用js直传oss阿里云存储文件,解决大文件上传服务器限制_js上传oss_孙奋斗的博客-CSDN博客使用js直传oss阿里云存储文件,解决大文件上传服务器限制每个OSS的用户都会用到上传服务。Web端常见的上传方法是用户在浏览器或App端上传文件到应用服务器,应用服务器再把文件上传到OSS。具体流程如下图所示。客户短上传和数据直传到OSS相比,以上方法有三个缺点:上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。扩展性差https://blog.csdn.net/qq_42958118/article/details/117601544

使用js直传oss阿里云存储文件,解决大文件上传服务器限制

  • 每个OSS的用户都会用到上传服务。Web端常见的上传方法是用户在浏览器或App端上传文件到应用服务器,应用服务器再把文件上传到OSS。具体流程如下图所示。

在这里插入图片描述

客户短上传和数据直传到OSS相比,以上方法有三个缺点:

上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。
扩展性差:如果后续用户多了,应用服务器会成为瓶颈。
费用高:需要准备多台应用服务器。由于OSS上传流量是免费的,如果数据直传到OSS,不通过应用服务器,那么将能省下几台应用服务器。

上面可能废话有点多(阿里云官方解释),下面咱别写代码边解释!

在这里插入图片描述
以上oss直传js文件目录(后面可以下载!)

在这里插入图片描述

upload.js
accessid= '***';//阿里云oss accessid
accesskey= '***';//阿里云oss accesskey
host = 'https://***.oss-cn-beijing.aliyuncs.com';//Bucket 域名

g_dirname1 = ''
g_object_name1 = ''
g_object_name1_type = ''
now = timestamp = Date.parse(new Date()) / 1000;

var policyText1 = {
    "expiration": "2040-12-01T12:00:00.000Z", //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
    "conditions": [
        ["content-length-range", 0, 3048576000] // 设置上传文件的大小限制
    ]
};

var policyBase65 = Base64.encode(JSON.stringify(policyText1))
message1 = policyBase65
var bytes1 = Crypto.HMAC(Crypto.SHA1, message1, accesskey, { asBytes: true }) ;
var signature1 = Crypto.util.bytesToBase64(bytes1);
//设置成随机文件名
function check_object_radio1() {
    var tt = document.getElementsByName('myradio1');
    for (var i = 0; i < tt.length ; i++ )
    {
        if(tt[i].checked)
        {
            g_object_name1_type = tt[i].value;
            break;
        }
    }
}

//设置上传目录
function get_dirname1()
{
     dir = document.getElementById("dirname1").value;/前台做了一个输入框可以自己定义上传的目录
   // dir ='';
    if (dir != '' && dir.indexOf('/') != dir.length - 1)
    {
        dir = dir + '/'
    }
    g_dirname1 = dir
}

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

function calculate_object_name1(filename)
{
    if (g_object_name1_type == 'local_name')
    {
        g_object_name1 += "${filename}"
    }
    else if (g_object_name1_type == 'random_name')
    {
        suffix = get_suffix1(filename)
        g_object_name1 = g_dirname1 + random_string(10) + suffix
    }
    return ''
}

function get_uploaded_object_name1(filename)
{
    if (g_object_name1_type == 'local_name')
    {
        tmp_name = g_object_name1
        tmp_name = tmp_name.replace("${filename}", filename);
        return tmp_name
    }
    else if(g_object_name1_type == 'random_name')
    {
        return g_object_name1
    }
}

function set_upload_param1(up, filename, ret)
{
    g_object_name1 = g_dirname1;
    if (filename != '') {
        suffix = get_suffix1(filename)
        calculate_object_name1(filename)
    }
    new_multipart_params = {
        'key' : g_object_name1,//
        'policy': policyBase65,
        'OSSAccessKeyId': accessid,
        'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
        'signature': signature1,
    };

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

    up.start();
}
var timer1,tryTime1,maxTry1=5,delay1=3000,num=0;
var uploader1 = new plupload.Uploader({//在文件里引入了一个 plupload前端上传插件
    runtimes : 'html5,flash,silverlight,html4',
    browse_button : 'selectfiles1',
    //multi_selection: false,
    container1: document.getElementById('container1'),
    flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',
    silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',
    url : 'http://oss.aliyuncs.com',
    init: {
        PostInit: function() {
            document.getElementById('ossfile1').innerHTML = '';
            document.getElementById('postfiles1').onclick = function() {
                set_upload_param1(uploader1, '', false);
                return false;
            };
        },

        FilesAdded: function(up, files) {//选择文件的信息
            plupload.each(files, function(file) {
                if(num==0){
                    document.getElementById('ossfile1').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>';
                    num++;
                }else{
                    return false;
                }

            });
        },

        BeforeUpload: function(up, file) {
            check_object_radio1();
            get_dirname1();
            set_upload_param1(up, file.name, true);
        },

        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= 5*file.percent+'px';
            progBar.setAttribute('aria-valuenow', file.percent);
        },

        FileUploaded: function(up, file, info) {
            if (info.status == 200)
            {
                tryTime1 = 0;//注释的地方是前端页面的一个视频播放组件
                // timer1 = setInterval(getDuration1, delay1);
                // videoElem = document.getElementById("au");
                // videoElem.innerHTML = '<source class="source" src="'+host+'/'+file.name+'" type="video/mp4">';
                // videoElem.play();
                $("#audioUrl").val(host+"/"+file.name+"");//返回的参数赋值到form之中
                document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name1(file.name);
            }
            else
            {
                document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
            }
        },

        Error: function(up, err) {
            document.getElementById('console1').appendChild(document.createTextNode("\nError xml:" + err.response));
        }
    }
});

function getDuration1() {
    clearInterval(timer1);
    var hour = parseInt((au.duration)/3600);
    var minute = parseInt((au.duration%3600)/60);
    var second = Math.ceil(au.duration%60);
    $("#showByNones").show();
    $("#lengthTime1").val(hour+":"+minute+":"+second);
    var lengthTime = $("#lengthTime").val();
    if (lengthTime == null || lengthTime == "") {
        $("#showByNones2").show();
        $("#lengthTime").val(hour+":"+minute+":"+second);
    }
}
uploader1.init();

上传不仅仅上面一个文件还有lib文件夹里面的一些插件包

下面看下我自己写的前端页面

```html
div class="form-group">
                        <label class="col-sm-2 control-label">商品视频:</label>
                        <div class="col-sm-10">
                            <div style="display: none;">
                                <input type="radio" name="myradio1" value="local_name" checked=true/> 上传文件名字保持本地文件名字
                                <input type="radio" name="myradio1" value="random_name" /> 上传文件名字是随机文件名
                                上传到指定目录:<input type="text" id='dirname1' placeholder="如果不填,默认是上传到根目录" size=50>
                            </div>
                                <div>
<!--                                    <video height="240" object-fit="scale-down" controls="controls" muted="muted"  loop id="au">-->
<!--                                    </video>  这个是html的视频组件和upload.js里面对应起来即可-->

                            <h4>您所选择的文件:</h4>
                                    <div id="ossfile1" style="width: 200px;"></div>
                                    <div id="container1">
                                        <a id="selectfiles1" href="javascript:void(0);" class='btn'>选择文件</a>
                                        <a id="postfiles1" href="javascript:void(0);" class='btn'>开始上传</a>
                                    </div>
<!--                                    <pre id="console1"></pre>  里面是上传的回调信息-->
                                </div>

                        </div>
                    </div>
           <div class="form-group"  id="showByNones">
                <label class="col-sm-2 control-label">视频网络地址:</label>
                <div class="col-sm-10">
                    <input id="audioUrl" name="video" class="form-control"
                           type="text"  value="{$data.video|default=''}" readonly="readonly">
                </div>
            </div>

<!--       下面是引入的js      -->
<script type="text/javascript" src="__PUBLIC__/js/oss/lib/crypto1/crypto/crypto.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/oss/lib/crypto1/hmac/hmac.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/oss/lib/crypto1/sha1/sha1.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/oss/lib/base64.js"></script>
<script type="text/javascript" src="__PUBLIC__/js/oss/lib/plupload-2.1.2/js/plupload.full.min.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/js/oss/upload1.js?v=3.6"></script>

上传效果如下:
在这里插入图片描述

下载文件直接傻瓜式操作!!!

使用 Multer 上传图片到阿里云 OSS的两种方式 这样这张图片,要上传两次,会造成网络资源的浪费,增加服务器的开销。尤其是在访问量大的情况下,会对项目的稳定运行,造成很大的影响。使用这种方式,一张图片,先要上传到 Node 项目的服务器中,然后再由 Node 服务器上传到阿里云 OSS。可以看到这里的代码还是比较简单的,上面需要先做一个配置,然后调用方法就可以上传了。所以明智的选择,要用云存储,这里我们以阿里云的对象存储为例来学习如何实现上传。对应的缺点就是,在开发上,代码麻烦点。大家复制的时候,注意下,只要前面这一部分,后面的完整域名不需要。 阅读详情

相关推荐

通过后端预签署的 Policy 在前端直接与 Amazon S3 交互并上传文件 AWS SDK for JavaScript v3 阿里云 OSS

因为与阿里云 OSS 的文档不同的是,Amazon S3(或者说 AWS S3)的直传文档并没有给出一个可以参考的代码案例,也没有提供链接到 SDK 下属 API 的文档链接,只是简单的甩出来几个文档来说明和介绍整个签名和计算 hash 的流程和步骤。简单来说,这样的流程允许我们在允许用户上传多个文件的时候,让服务端通过「复制」和「删除」,也就是「剪切」的操作,留下那些用户不要的文件到临时文件夹中,设定定时任务来清理和删除临时文件夹中的资源,最终实现对临时文件的管理和销毁的流程。

万有文的博客 2030

OSS上传(Java和Js)

使用RAM用户或STS方式访问 由于阿里云账号AccessKey拥有所有API访问权限,建议遵循阿里云安全最佳实践。如果部署在服务端可以使用RAM用户或STS来进行API访问或日常运维管控操作,如果部署在客户端请使用STS方式来进行API访问。 本文采用STS方式来实现上传功能,STS可以给第三方提供权限,在考虑接口安全的前提下,还是很合适的,当然如果是自己企业使用的话,也可以直接用RAM用户方式。代码都是类似的

岁月不饶人,我亦未曾饶过岁月 2304

js 导出pdf上传至oss_js -- nodejs实现oss签名直传, 前端直传,最简单实现

阿里云的oss真的文档写辣鸡, 直传的demo代码也辣鸡, 代码一坨一坨的。如果你被oss困住了, 那么你看这篇就完全可以解决问。一句话可以概括的非要写一堆, 加密请求前端直传的话有现成的例子https://help.aliyun.com/document_detail/31925.html但是这个里面代码特别不适合移植, 直接写重点就好了(吐槽: 里面一堆满足自己场景的代码)。然后推荐后台签名,...

weixin_39820185的博客 417

JavaScript实战 - 使用JavaScript上传文件到阿里云OSS

通过阿里云OSS JavaScript SDK,可以方便地将文件上传到阿里云OSS,实现高效的对象存储管理。在使用过程中,注意配置正确的Access Key和Bucket信息,确保权限和安全性。可以根据具体需求,添加文件上传进度、错误处理等功能来完善上传流程。通过本文的介绍,希望读者能够理解和实现基于JavaScript的文件上传到阿里云OSS的方法,并在实际项目中应用。

逍遥Sean的博客 2471

web直传OSS(断点续传)

web直传OSS(断点续传) 发布时间:2018-12-28 10:31:38 不多说,直接上代码 <input type="file" id="file" /> <script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-6.0.2.min.js"></script> <script> le...

jarisMA的博客 1545

Javascript实现文件上传到阿里云(附完整源码)

Javascript实现文件上传到阿里云(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 854

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

啥

fetch_all的博客 1168

oss实现js上传

oss实现js上传,极大提高服务器效率,希望大家多多交流

vue前端上传图片到阿里云,超详细上传图片教程,OSS,前端直传

前端上传图片到阿里云,OSS,超详细上传图片教程 首先是安装依赖 复制下面代码即可直接安装 npm install ali-oss 安装过程这里就直接跳过了,这个只是基本操作 接着是进行配置 在项目中的src包下的utils包中创建一个alioss.js文件,你也可以跟我一样创建的名字一样,实际上此.js文件可放在任意位置,只不过在导入时的路径会有所不同 在alioss.js文件中写入以下代码...

qbbhgn的博客 9770

WinCC与PLC在西门子逻辑赛项中的通信配置避坑指南

本文针对西门子逻辑赛项中WinCC与PLC通信配置的常见问题,提供了一套实战避坑指南。重点解析了WinCC、PLC与EET仿真平台的三角通信架构,强调了IP地址规划、防火墙设置等关键环节的注意事项,并给出了系统化的故障诊断流程与排查技巧,帮助选手和技术人员快速定位并解决通信故障,确保监控系统稳定运行。

weixin_29165725的博客 98

Matlab实战:从零搭建弹道导弹六自由度仿真模型(附完整代码)

本文详细介绍了如何使用Matlab从零搭建弹道导弹六自由度仿真模型,涵盖仿真环境配置、核心运动方程实现、气动力建模及仿真结果分析。通过完整代码示例,帮助读者掌握弹道导弹六自由度仿真的关键技术,适用于航空航天工程和复杂系统建模领域。

x8y9z0的博客 942

uniapp+vue3前端直传图片至阿里oss,附前端增加oss水印

由于公司项目后端带宽吃紧,遂要求在前端直传图片至阿里oss,不调用后端接口先传至后端再上传,同时项目需要在某些图片上传后用户看到的图片是自带水印的。关于水印这个问题找了很多帖子都不太适用,于是还是自己封装一个前端直传oss的组件达成需求。阿里oss上传所需关键的bucketName,accessid和secret,需要替换成自己的,怎么获取的教程其他帖子都有,就偷个懒不贴了。废话不多说,直接下面贴代码,详细和完整都贴,兄弟们按需求cv(笑)。

lyz19960724的博客 2341

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2652

使用js直传oss阿里云存储文件,解决大文件上传服务器限制

使用js直传oss阿里云存储文件,解决大文件上传服务器限制 每个OSS的用户都会用到上传服务。Web端常见的上传方法是用户在浏览器或App端上传文件到应用服务器,应用服务器再把文件上传到OSS。具体流程如下图所示。 客户短上传和数据直传到OSS相比,以上方法有三个缺点: 上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。 扩展性差

孙奋斗的博客 5231

Python自动化办公:5分钟搞定钉钉群文件自动发送(附完整代码)

本文详细介绍了如何利用Python实现钉钉群文件的自动化发送。通过结合钉钉企业内部应用与群机器人API,构建了包含智能令牌管理、文件上传与消息发送的完整工作流。文章提供了可直接复用的完整代码,并分享了定时任务、目录监听等进阶实战方案,帮助职场人士高效解决重复性文件发送难题,实现办公自动化。

7z8x2c4v6b9的博客 319

达梦--利用存储过程与定时任务实现数据自动迁移

本文详细介绍了在达梦数据库中如何结合存储过程与定时任务实现数据自动迁移。通过一个电商订单归档的实战案例,阐述了从设计表结构、编写具备异常处理和幂等性的存储过程,到配置DBMS_SCHEDULER定时任务的全流程。该方法能有效替代手动脚本,确保数据同步任务的稳定、准确与自动化执行,适用于报表准备、数据备份等多种场景。

weixin_29261711的博客 428

小程序阿里云oss前端直传

前言 按照我以前的风格,现在这篇文章也是,在网上找到各个版本的代码,发现无法使用。小程序作为当前最热门的模块,开发bug当然也不在少数,其中上传文件,也不单单依赖于后端。我使用的是阿里云oss,方法是前端直传,首先更正一下,OSS的API并不支持小程序前端直传。 当前各个IT网站交流,贴子的地方,都有很多 一、开发配置 Hbuilder软件的uniapp项目,后端java 二、百度之后一系列开发问题 1、内容冗长不清楚写的什么 各式各样的代码通篇无注释,也不知道写的什么东西(这种人真的不想说。。。估计又是从

Lazy33的博客 2368

Feature ‘alsa‘ was enabled, but the pre-condition ‘config.unix && !config.qnx && libs.alsa‘ failed解决

这个问题主要是Qt多媒体插件中缺少了ALSA音频库,所以我们需要自行先编译ALSA 在执行./configure的时候,配置项中ALSA为no Qt Multimedia: ALSA ................................... no GStreamer 1.0 .......................... no GStreamer 0.10 ......................... no Video for Linux .............

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 2582

阿里云 OSS JS前端直传 代码封装

OSS JS前端直传封装: function upload(f,callback){ var client = new OSS.Wrapper({ region : 'oss-cn-beijing', accessKeyId : 'LTAIJDKAA9Bww5', accessKeySecret : 'd4Aw0BmtFa31yYGItEPZ9LpGFSAA...

Adobe Chow 的博客 5101

信号处理算法:离散余弦变换(DCT)_(1).离散余弦变换(DCT)概述

离散余弦变换的数学定义如下:对于一个长度为NNN的离散信号xnx(n)xn,其DCT变换后的系数XkX(k)XkXk∑n0N−1xncos⁡πNn12kk012N−1Xkn0∑N−1​xncosNπ​n21​kk012N−1其中,kkk是频率指数,nnn是时间或空间索引。离散余弦变换(DCT)是一种强大的信号处理技术,广泛应用于图像压缩、音频处理、数据压缩等领域。

2401_87715305的博客 1544

Android14 Qcom 从Framework到Driver带你打开WIFI(二)

上篇文章讲到了UI打开WIFI以后,逐步调用到加载底层驱动以及通知等相关流程。这篇接着上文继续往下看WIFI ON的后续动作。

IAYLBL的博客 758

VUE前端分片直传大文件到OSS方法

前面上传文件到OSS是使用的spring boot服务器上传,并搞定了大文件分片上传,但是在前后端分离的程序,使用这个方法效率存问题,用户浏览器先要将文件上传到运行VUE的nginx服务器,再转到spring boot应用服务器,然后再转到OSS服务器,要在服务器之间多转一次,会影响服务器效率。 后经同行提醒,阿里云OSS支持node.js SDK接口,可能在VUE服务器上,直接通过JS接口上传OSS服务器。 上传文件到OSS服务器,需要访问OSS的accessKeyId、accessKeySecret等重

wujize的博客 3535

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

前端不暴露ak/sk直接上传阿里云oss的方案

介绍如何在不暴露ak/sk的情况下,使用javascript直接上传阿里云 oss的方案,并小小的吐槽一下

北亮的专栏 4121

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

实现阿里云OSS文件上传

OSS、服务端签名前端直传

longxiaobai_WJ的博客 5332

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

vue中使用oss直传图片到阿里云

1.引入 在index.html中引入 <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script> 2.上传 我使用的是vant组件中的图片上传组件 <van-uploader v-model.trim="item.fileList" :after-rea...

小剑儿的博客 1616
上一篇: 【优质推荐】一张图囊括.Net完整技术体系
下一篇: 【优质推荐】全网最全Python操作Excel教程
K'のBlog
博客等级 码龄18年 1万+粉丝 413原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值