首页 > 编程语言 >c#-文件切片上传

c#-文件切片上传

时间:2024-02-07 17:33:56浏览次数:18  
标签:function c# fileName 切片 file totalChunks var currentChunk 上传

前台代码:

<form id="uploadForm" enctype="multipart/form-data">
    <input type="file" name="file" id="fileInput" multiple />
    <button type="button" onclick="onuploadForm()">上传</button>
</form>
<div id="progressBar" style="background-color: lightgray; height: 20px;"></div>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
    function onuploadForm() {
        var file = $('#fileInput').get(0).files[0];

        var chunkSize = 1024 * 1024; // 1MB
        var fileSize = file.size;
        var totalChunks = Math.ceil(fileSize / chunkSize);
        var currentChunk = 0;

        var uploadChunk = function () {
            var start = currentChunk * chunkSize;
            var end = Math.min(start + chunkSize, fileSize);

            var formData = new FormData();
            formData.append('file', file.slice(start, end));
            formData.append('totalChunks', totalChunks);
            formData.append('currentChunk', currentChunk);

            $.ajax({
                url: '/File/ProcessChunk',
                type: 'POST',
                data: formData,
                contentType: false,
                processData: false,
                beforeSend: function () {
                    // 在发送请求之前,初始化一些相关操作
                    $('#progressBar').width('0%');
                    $('#progressBar').text('0%');
                },
                uploadProgress: function (event, position, total, percentComplete) {
                    // 在上传过程中更新进度条
                    var percent = percentComplete.toFixed(2) + '%';
                    $('#progressBar').width(percent);
                    $('#progressBar').text(percent);
                },
                success: function (result) {
                    currentChunk++;

                    if (currentChunk < totalChunks) {
                        uploadChunk();
                    } else {
                        console.log('文件上传成功');
                        mergeChunks(result.fileName, result.totalChunks);
                    }
                },
                error: function (error) {
                    console.log(error);
                }
            });
        };

        uploadChunk();
    }

    // 合并切片请求
    function mergeChunks(fileName, totalChunks) {
        $.ajax({
            type: "POST",
            url: "/File/MergeChunks",
            data: { fileName: fileName, totalChunks: totalChunks },
            success: function (result) {
                console.log(result);
                if (result.success) {
                    alert('文件上传并合并成功');
                } else {
                    alert('合并切片失败');
                }
            },
            error: function () {
                alert('合并切片请求错误');
            }
        });
    }
</script>

 

后台mvc代码:

 [HttpPost]
        public IActionResult ProcessChunk(IFormFile file, int totalChunks, int currentChunk)
        {
            var uploadsFolderPath = Path.Combine(Directory.GetCurrentDirectory(), "Uploads");
            var fileName = Path.GetFileName(file.FileName);
            var filePath = Path.Combine(uploadsFolderPath, fileName + $".part{currentChunk}");

            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                file.CopyTo(stream);
            }

            return Ok();
        }

        [HttpPost]
        public IActionResult MergeChunks(string fileName, int totalChunks)
        {
            var uploadsFolderPath = Path.Combine(Directory.GetCurrentDirectory(), "Uploads");
            var mergedFilePath = Path.Combine(uploadsFolderPath, fileName);

            using (var mergedFileStream = new FileStream(mergedFilePath, FileMode.Create))
            {
                for (int i = 0; i < totalChunks; i++)
                {
                    var partFilePath = Path.Combine(uploadsFolderPath, fileName + $".part{i}");

                    using (var partFileStream = new FileStream(partFilePath, FileMode.Open))
                    {
                        partFileStream.CopyTo(mergedFileStream);
                    }

                    System.IO.File.Delete(partFilePath);
                }
            }

            return Ok();
        }

要是对进度条不满意 可使用下面的:

<div class="progress-bar" style="display:none">
    <div class="progress"></div>
</div>
<style>

 .progress-bar {
     width: 100%;
     height: 20px;
     background-color: #f0f0f0;
     border-radius: 10px;
     overflow: hidden;
     position: relative;
 }

 .progress {
     height: 100%;
     background-color: #4caf50;
     width: 0;
     transition: width 0.5s ease-in-out;
     position: absolute;
     top: 0;
     left: 0;
 }
</style>

至于对进度条赋值:

$('.progress').css('width', percentComplete + '%');

 建议:js不要使用alert 弹框  避免影响进度条加载进度  优先考虑使用如layui 中下面这种方式

layer.msg('文件上传并合并成功', { icon: 1 });

 

标签:function,c#,fileName,切片,file,totalChunks,var,currentChunk,上传
From: https://www.cnblogs.com/wuyabaibsd/p/18011116

相关文章

  • WC/CTS 2024 游记
    我从小就热爱音乐,接下来省略800字,所以长大后成为了一名交响乐团的副指挥.一次机缘巧合的机会之下,我们乐团有幸参与一场新型话剧的配乐工作.接下来,观众落座,首先是领导开场讲话,表示对于这种新型艺术形式的支持,这些陈词滥调,观众鼓掌什么的我们就略过好了.灯光变......
  • LocalDateTime判断时间段归属
    //v2024-02-0207:52:572024-02-0214:39:14//DateinTime=Date.from(Instant.ofEpochMilli(1707150614000L));//LocalDateTimeinTimeLocalDateTime=DateUtil.dateToLocalDateTime(inTime);LocalDateTimeinTime=LocalDateTime.parse("2024-02-01......
  • 无涯教程-RegExp.prototype.exec()函数
    exec方法在字符串中搜索与正则表达式匹配的文本。如果找到匹配项,则返回输出数组。否则,返回null。RegExp.prototype.exec()-语法RegExpObject.exec(string);string  - 要搜索的字符串RegExp.prototype.exec()-返回值如果找到匹配项,则返回匹配的文本,否则......
  • C语言解题 || 计算数字矩阵的2条对角线之和
    题目:写一个函数calc_matrix(intn)实现如下功能:先输入整数n,然后输入nn个整数,构成nn矩阵,计算对角线上的数之和,并输出该和。例如:先输入3,然后输入1,2,3,4,5,6,7,8,9对角线上是数之和为:1+5+9+3+7=25。写出完整的程序代码,在main函数中调用上述函数calc_matrix题目分析:通过研究数......
  • docker---dockerfile自定义镜像指令
    dockerfile指令FROM#指定所基于的镜像名称及其标签来创建新镜像。RUN#在镜像中执行命令。ADD#将文件或目录复制到镜像中。可以使用URL作为源文件。COPY#与ADD类似,将文件或目录复制到镜像中,但不支持URL作为源文件。CMD#指定运行容器时要执行的命令,如果在......
  • docker的优势和劣势
    优势:1.轻量级快速:Docker利用容器技术,相比传统虚拟化技术更加轻量级,启动速度快,资源消耗低,使得应用可以更快地部署和运行。2.跨平台:Docker支持跨平台运行,可以在不同的操作系统上运行,例如Linux、Windows和macOS等,为开发和部署提供了更大的灵活性。3.隔离性:Docker容器提......
  • golang类型转换模块之gconv
    gf框架提供了非常强大的类型转换包gconv,可以实现将任何数据类型转换为指定的数据类型,对常用基本数据类型之间的无缝转换,同时也支持任意类型到struct对象的属性赋值。由于gconv模块内部大量使用了断言而非反射(仅struct转换使用到了反射),因此执行的效率非常高。使用方式:import"g......
  • Cesium
    HelloWorld-CesiumSandcastleCesium的主要特点如下:高性能:Cesium使用WebGL技术来实现3D地球渲染,具有优异的性能和效果。跨平台:Cesium支持Windows、Linux、macOS和iOS等多个操作系统,同时也可以在各种浏览器中运行。开放性:Cesium是一个完全开源的项目,任何人都可......
  • docker-compose
    docker-compose简介DockerCompose是Docker官方提供的一个用于定义和运行多个Docker容器的工具。它允许用户使用一个单独的文件(通常称为docker-compose.yml)来配置应用程序的服务,并使用一条命令启动、停止和管理整个应用程序的容器。以下是DockerCompose的主要功能和特点......
  • CF1927 A~G
    Alink找最左边和最右边的'B'即可,注意找不到时的处理。Blink用\(26\)个桶记录一下每一个字母出现的次数,不断找合法字母即可,时间复杂度\(O(26n)\)。Clink明显的贪心,记录一下每个数字在哪个数组中出现过,统计一下每个数组有多少只在自己数组出现的数,如果这个数超过\(k\)......