C#文件上传——分块上传

一、前言

本文介绍分块上传,第二部分为文章的主体部分,先介绍分块上传的需求——服务端限制文件大小,然后是分块上传的概要描述,最后给出分块上传的核心代码,文末给出源工程代码文件,一起来看看吧!

注意:分块上传也称分片上传,下文的中的“块”和“片”是一个意思

二、分块上传

2.1 需求:分块上传

在客户端请求服务端的进行文件上传的时候,我们需要调用服务端开发人员给的两个接口,一个是文件上传接口,一个是数据上传接口,一般来说,我们先调用文件上传接口,文件上传成功后,得到相应的filePath参数,其值写入到数据上传接口的相应参数中,然后数据上传(一个post请求),数据上传成功后整个过程就算完成。

但是,有时候服务端对文件上传时的大小做出限制,如只能上传4M以内的文件,但是遇到大于4M的文件怎么办呢?反正服务端是处理不了了,超过规定大小的文件会返回“500 服务端错误”,这里我们要将的就是分块上传。

注意:服务端放开大文件限制也是可以的,但是本文要讲的时分块上传

2.2 分块上传概要

分块上传中,因为服务端对文件大小有限制,所有将一个大文件分成很多固定大小的块,
对于每个块ChunkInfo,如

 public class ChunkInfo
    {
        public int Chunk { get; set; }   // 序号
        public int Chunks { get; set; }    //总数量
        public long StartSize { get; set; }   //开始size
        public long EndSize { get; set; }   //结束size
        public long TotalSize { get; set; }   //总size
        public byte[] Byte { get; set; }    //字节数组
        public long ByteLength { get; set; }  //字节长度
    }

这里一个ChunkInfo Bean类,记录了一个块的序号、总数量、开始size、结束size、总size、字节数组、字节长度。
图中每个块chunk为2M,每个块上传的时候都要发送一次网络请求(因为服务端只能接收块大小的文件),一个文件所有块上传完之后,将文件上传返回的filePath存入全局Arraylist的item中(后面数据上传要用到),所有文件上传完成后,开始数据上传(就是一个post网络请求),数据上传成功后,整个过程就算成功,控制台可以打开提示方便查看。

2.3 分块上传具体实现

2.3.1 文件Bean和分块Bean

文件Bean:代码中的UploadFile类,该类中类似FileID FileName FilePath FileLength属性都是根据服务端需要添加的,和服务端的字段对应,读者使用的时候应该根据服务端/数据库具体情况来,不要照抄,这里只是一个示例。

分块Bean:代码中的ChunkInfo类,该类中属性作用于分块操作,如Chunk属性表示该分块的序号、Chunks属性表示分块总数量(当前文件分块总数量),这里是笔者自己代码中定义的,读者使用可以照抄。

2.3.2 文件分块

CutFile()函数,将传入的文件路径的所指定的文件按分块大小分块,变成一个个分块对象new ChunkInfo(),添加到listChunk中,并将listChunk返回。

2.3.3 上传文件片的具体实现

DoSend()函数就是用于上传当前分块,每一个分块上传到服务端都要调用该函数一次,返回为true表示上传成功,返回为false变成上传失败(重复上传retryCount次)。

2.3.4 文件上传的三层实现

1、上传每一个片

2、上传每一个文件

3、上传所有文件

2.3.5 数据上传

文件上传完成后,调用UploadSuccess()函数,该函数中进行数据上传(就是一个post网络请求),数据上传成功后表示整个过程完成,控制台打印成功,让自己看到。

三、小结

本文介绍分块上传,第二部分为文章的主体部分,先介绍分块上传的需求——服务端限制文件大小,然后是分块上传的概要描述,最后给出分块上传的核心代码,文末给出源工程代码文件。
天天打码,天天进步!

工程源代码:https://download.csdn.net/download/qq_36963950/12250649

发布了190 篇原创文章 · 获赞 71 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_36963950/article/details/104868774