• 在.net Core中如何使用HTML5上传视频


    最近刚做了视频上传的功能,有一些心得还有注意事项,这里不贴全部代码,主要是讲述编码思路。本代码基于.net core 、html5示例

    完成视频上传的两种思路

    1、视频分片上传,比如把整个视频拆分成2兆一片,最后一片上传完再组合成一个视频。这种方式是针对断网、服务器中断连接等中断的情况

          具体实现方式:

    • 计算文件需要差分成几片
    • 按1,2,3...排序拆好放到文件夹
    • 最后一片拆好后合并成一个视频文件
    • 最后删除分片的文件夹,避免无用资源堆积

    以下是html部分的代码

        <div class="row" style="margin-top: 20px; margin-left: 20px;">
                                <div class="col-lg-4"></div>
                                <div class="col-lg-4">
                                    <input type="text" value="请选择文件" size="20" name="upfile" id="upfile" style="border:1px dotted #ccc">
                                    <input type="button" value="浏览" onclick="path.click()" style="border:1px solid #ccc;background:#fff">
                                    <input type="file" id="path" style="display:none" multiple="multiple" onchange="upfile.value=this.value">
    
                                    <p style="margin-top: 20px;">
                                        <button type="button" id="file" onclick="UploadStart()">开始上传</button>
                                        &nbsp;&nbsp;&nbsp;<span id="output" style="color: darkgreen;font-size: large"> </span>
                                        &nbsp;&nbsp;&nbsp;
                                        <label id="labErrorTip" style="color: red"></label>
                                    </p>
                                    <p id="showXC" style="margin-top: 20px;display: none">
                                        <input type="button" id="btnXC" value="继续上传" />
                                    </p>
    
                                </div>
                                <div class="col-lg-4"></div>
                            </div>
                            <div style="margin-top: 10px;">
                                <video width="60%" id="myVideo" controls>
                                        <source src=""  id ="VideoURL" type="video/mp4" autoplay="true">
                                 </video>
                            </div>

    代码分析:HTML定义了显示文件路径文本框、选择文件的按钮、上传按钮、显示视频的Video(html5出的)。点击浏览选择文件,文件路径显示在上面的文本框内,点击开始上传按钮执行上传代码。

    以下是JS代码:

     var UploadPath = "";
        var errorNum = 0;
        var stop = false;
        //开始上传
        function UploadStart() {
            var file = $("#path")[0].files[0];
            if (file.length <= 0) {
                $.fail("请选择文件");
                return false;
            }
            $("#file").attr("onclick", "void()");
            $("#file").html("上传中...");
            $("#file").attr("disabled", true);//禁用上传按钮
            AjaxFile(file, 0);
        }
    
        function AjaxFile() {
            var file = $("#path")[0].files[0];
            var name = file.name, //文件名
                size = file.size, //总大小shardSize = 2 * 1024 * 1024,
                shardSize = 2 * 1024 * 1024,//以2MB为一个分片
                shardCount = Math.ceil(size / shardSize); //总片数
            if (i >= shardCount) {
                return;
            }
            //计算每一片的起始与结束位置
            var start = i * shardSize,
                end = Math.min(size, start + shardSize);
            //构造一个表单,FormData是HTML5新增的
            var form = new FormData();
            form.append("data", file.slice(start, end)); //slice方法用于切出文件的一部分
            form.append("lastModified", file.lastModified);
            form.append("fileName", name);
            form.append("total", shardCount); //总片数
            form.append("index", i + 1); //当前是第几片
            form.append("sizeKB", size / 1024); //大小    KB
            UploadPath = file.lastModified;
            //Ajax提交文件
            $.ajax({
                url: "后台处理地址",
                type: "POST",
                xhrFields: {
                    withCredentials: true //配置http跨域请求中携带cookie
                },
                data: form,
                async: true, //异步
                processData: false, //很重要,告诉jquery不要对form进行处理
                contentType: false, //很重要,指定为false才能形成正确的Content-Type
                success: function (result) {
                    if (result != null) {
                        if (result.code == "-1") {
                            $.fail(result.msg);
                            $("#file").attr("onclick", "UploadStart()");
                            $("#file").val("开始上传");
                            $("#file").attr("disabled", false);
                            return false;
                        }
                        i = result.number++;
                        var num = Math.ceil(i * 100 / shardCount);
                        if (num > 99) {
                            $("#output").text("即将完成...");
                        }
                        else {
                            $("#output").text(num + '%');
                        }
                        $("#labErrorTip").html("");
                        $("#showXC").css("display", "none");
    
                        AjaxFile(file, i);
                        if (result.mergeOk) {
                            var filepath = $("#path");
                            filepath.after(filepath.clone().val(""));
                            filepath.remove();//清空input file
    
                            $("#output").text("上传成功");
                            $("#VideoURL").attr("src", result.data);//更新数据源
                            document.getElementById("myVideo").load();//重新启动Video,如果不重新启动Video不会播放新视频
                            document.getElementById("myVideo").play();//播放
                            $("#file").removeAttr("disabled");//打开上传按钮
                            $("#file").html("开始上传");
                        }
                    }
                },
                error: function () {
                    errorNum = errorNum + 1;
                    if (errorNum > 2) {
                        $("#labErrorTip").html("发生异常");
                        $("#showXC").css("display", "block");
                        $("#btnXC").attr("onclick", "UploadStart()");
                    } else {
                        $("#labErrorTip").html("发生异常,正在尝试继续上传");
                        AjaxFile(file, i);
                    }
                }
            });
        }

    代码分析:在js里对文件进行拆分,拆分的计算公式跟分页的理论一样,然后把片段发到后台进行一系列处理。上面要注意的点都写了注释,重点的几个点也标注了。后台代码就不贴了,组合片段的方式网上搜一搜可以找到,记得找出的片段排下序以免视频错乱。

    2、也可以整个视频上传后,如果中断可根据已上传的大小来判断从某个点开始继续上传。这种方式没做过,道理差不多

  • 相关阅读:
    数据库(六)
    数据库(五)
    数据库(四)
    数据库(三)
    数据库(二)
    数据库
    函数 枚举和递归
    数据类型(四) 集合
    数据库基础
    特殊集合 结构体
  • 原文地址:https://www.cnblogs.com/xiaoxiaoqiao/p/10287373.html
Copyright © 2020-2023  润新知