zoukankan      html  css  js  c++  java
  • 断点上传文件

    断点上传文件的一个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; }
        }
    }
  • 相关阅读:
    Chrome浏览器M53更新后超链接的dispatchEvent(evt)方法无法触发文件下载
    用es5实现模板字符串
    JS求数组最大值常用方法
    js生成随机数
    常用MouseEvent鼠标事件对象&KeyboardEvent键盘事件对象&常用键盘码
    原生js重写each方法
    indexdb开cai发keng实zhi践lu
    substring和substr的区别和使用
    前端常见面试题总结part2
    前端常见面试题总结1
  • 原文地址:https://www.cnblogs.com/macT/p/12674132.html
Copyright © 2011-2022 走看看