首页 > 其他分享 >js下载媒体文件(分片下载)

js下载媒体文件(分片下载)

时间:2023-08-24 17:23:21浏览次数:34  
标签:const layui 媒体文件 js blob offset filename 下载

html:

    <div class="usnbox">
        <div class="usnboxbody usnboxbody_rtm">
            <div class="layui-form-item">
                <div class="layui-inline">
                    <label class="layui-form-label">时长</label>
                    <div class="layui-input-inline">
                        <input type="text" name="timelength" value="" autocomplete="off" placeholder="时长" class="layui-input noedit" disabled>
                    </div>
                    <label class="layui-form-label">文件大小</label>
                    <div class="layui-input-inline">
                        <input type="text" name="filesize" value="" autocomplete="off" placeholder="文件大小" class="layui-input noedit" disabled>
                    </div>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">文件名称<span class="usStar"></span></label>
                <div class="layui-input-block">
                    <input type="text" name="filename" lay-verify="required" autocomplete="off" placeholder="文件名称"
                           class="layui-input noedit" disabled>
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">
                    文件地址<span class="usStar"></span>
                </label>
                <div class="layui-input-block">
                    <input type="text" name="vurl" lay-verify="required" autocomplete="off" placeholder="文件路径"
                           class="layui-input noedit" disabled>
                </div>
            </div>
            <div class="layui-form-item">
                <div class="layui-progress layui-progress-big" style="width:100%;margin-top:20px;" lay-showPercent="true" lay-filter="updprogress">
                    <div class="layui-progress-bar" lay-percent="0%"></div>
                </div>
            </div>
        </div>
    </div>

    <div class="layui-form-item us-submitsave">
        <div class="uscenter">
            <button class="layui-btn" onclick="upload()"><i class="us-icon">&#xe619;</i>下载</button>
            <button type="button" class="layui-btn layui-btn-primary" data-pwid="usclose"><i class="us-icon">&#xe638;</i>关闭</button>
        </div>
    </div>

 

js方法实现下载:

<script> 
var element;
    $(function () {
        //layui操作句柄
        layui.use('element', function () {
            element = layui.element;
        })
    })

async function upload() {
        //获取文件路径
        var vurl = $("input[name=vurl]").val();
        //获取文件名称
        var filename = $("input[name=filename]").val();
        const CHUNK_SIZE = 1024 * 1024 * 10; // 每次下载10MB
        const response = await fetch(vurl);
        const contentRange = response.headers.get('content-range');
       //获取下载文件大小
        const fileSize = contentRange ? Number(contentRange.split('/')[1]) : response.headers.get('content-length');
        const fileStream = [];
        let offset = 0;
        //进行分片
        while (offset < fileSize) {
            const end = Math.min(offset + CHUNK_SIZE, fileSize);
            const options = {
                headers: { 'Range': `bytes=${offset}-${end - 1}` }
            };
            const blob = await fetch(vurl, options).then(res => res.blob())
            fileStream.push(blob);
            offset = end;
            //console.error(offset);
            //console.error(fileSize);
            var p = Math.floor(offset / fileSize * 100);
            //设置layui进度条
            setprogress(p);
        };
        //结束后,组装分片
        const blob = new Blob(fileStream, { type: response.headers.get('content-type') });
       //保存,触发浏览器的下载窗口
        saveAs(blob, filename);
    }

    //保存
    function saveAs(blob, filename) {
        const a = document.createElement('a');
        a.href = URL.createObjectURL(blob);
        a.download = filename;
        a.click();
    }

    //设置layui进度条(动态)
    function setprogress(p) {
        p = p + '%';
        console.error(p);
        element.progress('updprogress', p);
    }
</script>

参考文献:

javascript 大文件下载,分片下载,断点续传

layui框架学习(12:进度条)

标签:const,layui,媒体文件,js,blob,offset,filename,下载
From: https://www.cnblogs.com/ZhuMeng-Chao/p/17654670.html

相关文章

  • js面向对象编程
    基本概念面向对象编程将一个系统抽象为许多对象的集合,每一个对象代表了这个系统的特定方面。对象包括函数(方法)和数据。一个对象可以向其他部分的代码提供一个公共接口,而其他部分的代码可以通过公共接口执行该对象的特定操作,系统的其他部分不需要关心对象内部是如何完成任务的,这样......
  • javascript实现大文件上传下载
    ​ IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续......
  • js实现大文件上传下载
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • php实现大文件上传下载
    ​ 前段时间做视频上传业务,通过网页上传视频到服务器。视频大小小则几十M,大则1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制;2,请求时间过长,请求超时;3,传输中断,必须重新上传导致前功尽弃; 解决方案:1,修改服务端上传的限制配置;Nginx以......
  • Electron,VUEJS3,Vite,TypesSript 开发环境配置
    Electron,VUEJS3,Vite,TypesSript开发环境配置项目早期是vue3+vite开发的,后期由于运营需求,要修改为Win安装包。方案还是比较多的:1.WPF-Webview由于目前只需要兼容win,所以可以选择WPF,但WPF需要WebView的,还需要本地架设服务。整体部署比较复杂以及需要熟悉C#与WPF相关开发。2.......
  • jsp实现大文件上传下载
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • java裁切NC文件并转成Json
    importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;importorg.junit.Test;importucar.ma2.Index;importucar.nc2.NetcdfFile;importucar.ma2.Array;importjava.io.FileWriter;importjava.io.IOException;publicclassNetCDF2JS......
  • kettle引入外部js
    //自带的函数参数即为js的路径LoadScriptFile("F:/bigdata-etl/user_center_auto/USER/aes.js");varAESPHONE=PHONE;vardecTel=aesDecrypt(AESPHONE,"ksu7gk4H7Gs9362F")functionaesDecrypt(str,key){varresult_value;try{......
  • 直播商城源码,JS Date配置日期格式化
    直播商城源码,JSDate配置日期格式化引入jsDate配置化diamante Date.prototype.format=function(fmt){  varo={    "M+":this.getMonth()+1,         //月份    "d+":this.getDate(),          //日  ......
  • java实现大文件上传下载
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......