断点上传文件

断点上传文件的一个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; }
    }
}
原文地址:https://www.cnblogs.com/macT/p/12674132.html