断点上传文件的一个demo,不想用请求头什么的上传,就写了一个这种的,具体业务中可以把帮助类改成web接口的形式,那么只需要接口传递UploadFileInfo这个实体就可以了。
调用:
static private void UploadFile(string FilePath) { FilePath = @"E:1路口批量导入0325113311.xls"; const int maxSize = 1024 * 100; FileStream stream = File.OpenRead(FilePath); string fileName = Path.GetFileNameWithoutExtension(FilePath); UploadFileInfo file = new UploadFileInfo(); file.Offset = 0; //设置文件从开始位置进行数据传递 file.Name = fileName; file.Length = stream.Length; file.FILEEXTNAME = Path.GetExtension(FilePath); if (file.Length == 0) { stream.Close(); return; } else { while (file.Length != file.Offset) //循环的读取文件,上传,直到文件的长度等于文件的偏移量 { file.Data = new byte[file.Length - file.Offset <= maxSize ? file.Length - file.Offset : maxSize]; //设置传递的数据的大小 stream.Position = file.Offset; //设置本地文件数据的读取位置 stream.Read(file.Data, 0, file.Data.Length);//把数据写入到file.Data中 file = FileImageInfoService.UplodaFile(file);//上传 } } stream.Close(); }
帮助类:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { public class FileImageInfoService { /// <summary> /// 断点续传文件 /// </summary> /// <param name="file"></param> /// <returns></returns> static public UploadFileInfo UplodaFile(UploadFileInfo file) { string filePath = @"D:upload";//文件上传的保存目录 // string filePath = System.Configuration.ConfigurationManager.AppSettings["saveFileFolder"]; if (file.Offset == 0)//第一次传入文件 { DateTime dateTime = DateTime.Now; file.Name = file.Name; file.NewName = Guid.NewGuid().ToString("N") + file.FILEEXTNAME; filePath = Path.Combine(filePath, "uploadFiles", dateTime.ToString("yyyy-MM-dd")); checkDIR(filePath); filePath = Path.Combine(filePath, file.NewName); file.SAVEPATH = filePath; } FileStream fs = new FileStream(file.SAVEPATH, FileMode.OpenOrCreate);//打开文件夹 long offset = file.Offset; //file.Offset 文件偏移位置,表示从这个位置开始进行后面的数据添加 BinaryWriter writer = new BinaryWriter(fs);//初始化文件写入器 writer.Seek((int)offset, SeekOrigin.Begin);//设置文件的写入位置 writer.Write(file.Data);//写入数据 file.Offset = fs.Length;//返回追加数据后的文件位置 file.Data = null; writer.Close(); fs.Close(); return file; } //检查目录,如果不存在则创建 static private void checkDIR(string path) { if (!Directory.Exists(path)) Directory.CreateDirectory(path); } } public class UploadFileInfo { //文件名(上传前) public string Name { get; set; } // 文件名(上传后) public string NewName { get; set; } //文件大小 public long Length { get; set; } //文件的偏移量 public long Offset { get; set; } //传递的字节数 public byte[] Data { get; set; } // 文件类型 public string FILEEXTNAME { get; set; } //文件保存的物理路径 public string SAVEPATH { get; set; } } }