温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#如何实现文件上传下载功能

发布时间:2021-07-10 11:14:54 来源:亿速云 阅读:170 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“C#如何实现文件上传下载功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何实现文件上传下载功能”这篇文章吧。

具体代码如下所示:

//打开Excel文件,转换为DataTable       DataTable dtExcel;     private void OpenFile()     {       OpenFileDialog dialog = new OpenFileDialog();       dialog.Filter = "Microsoft Excel files(*.xls)|*.xls;*.xlsx"; //筛选打开文件类型 :图片 *.jpg|*.jpg|*.bmp|*.bmp ;"音频文|*.mp3;*.wma;*.aac;*.midi;*.wav" 等等       if (dialog.ShowDialog() == DialogResult.OK)       {         dialogFileName = dialog.FileName;         dtExcel = ExcelToDataTable(dialogFileName, "sheet1", true);       }     } /// <summary>   /// Excel转Datatable   /// </summary>   /// <param name="fileName">文件名含后缀名</param>   /// <param name="sheetName">Excel文件,页名称</param>   /// <param name="isFirstRowColumn">是否将第一列作为表头</param>   /// <returns></returns>   private DataTable ExcelToDataTable(string fileName, string sheetName, bool isFirstRowColumn)   {    IWorkbook workbook = null;    FileStream fs = null;    ISheet sheet = null;    DataTable data = new DataTable();    int startRow = 0;    try    {     fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);     if (fileName.IndexOf(".xlsx") > 0) // 2007版本      workbook = new XSSFWorkbook(fs);     else if (fileName.IndexOf(".xls") > 0) // 2003版本      workbook = new HSSFWorkbook(fs);     if (sheetName != null)     {      sheet = workbook.GetSheet(sheetName);      if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet      {       sheet = workbook.GetSheetAt(0);      }     }     else     {      sheet = workbook.GetSheetAt(0);     }     if (sheet != null)     {      IRow firstRow = sheet.GetRow(0);      int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数      if (isFirstRowColumn)      {       for (int i = firstRow.FirstCellNum; i < cellCount; ++i)       {        ICell cell = firstRow.GetCell(i);        if (cell != null)        {         string cellValue = cell.StringCellValue;         if (cellValue != null)         {          DataColumn column = new DataColumn(cellValue);          data.Columns.Add(column);         }        }       }       startRow = sheet.FirstRowNum + 1;      }      else      {       startRow = sheet.FirstRowNum;      }      //最后一列的标号      int rowCount = sheet.LastRowNum;      for (int i = startRow; i <= rowCount; ++i)      {       IRow row = sheet.GetRow(i);       if (row == null) continue; //没有数据的行默认是null              DataRow dataRow = data.NewRow();       for (int j = row.FirstCellNum; j < cellCount; ++j)       {        if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null         dataRow[j] = row.GetCell(j).ToString();       }       data.Rows.Add(dataRow);      }     }     return data;    }    catch (Exception ex)    {     MyMessageBox.Show(ex.Message);     return null;    }   }

文件下载:

private void DownLoad()   {    if (impdefineBM != null)    {     FolderBrowserDialog path = new FolderBrowserDialog();     path.ShowDialog();     if (path != null && path.SelectedPath != "")     {      string url = @"http://192.168.1.1/XX.xls";  //下载地址      string name = "FileName";              // 文件名称      string savefilepath = path.SelectedPath + "\\" + name + url.Substring(url.LastIndexOf(".")); //注意:下载文件名的命名 ,可根据实际需求调整调用的文件创建方式      MultiDownload download = new MultiDownload(5, url, savefilepath); //调用多线程下载      download.Start();     }    }   }  #region 多线程下载   public class MultiDownload   {    #region 变量    private int _threadNum;    //线程数量    private long _fileSize;    //文件大小    private string _fileUrl;   //文件地址    private string _fileName;   //文件名    private string _savePath;   //保存路径    private short _threadCompleteNum; //线程完成数量    private bool _isComplete;   //是否完成    private volatile int _downloadSize; //当前下载大小(实时的)    private Thread[] _thread;   //线程数组    private List<string> _tempFiles = new List<string>();    private object locker = new object();    #endregion    #region 属性    /// <summary>    /// 文件名    /// </summary>    public string FileName    {     get     {      return _fileName;     }     set     {      _fileName = value;     }    }    /// <summary>    /// 文件大小    /// </summary>    public long FileSize    {     get     {      return _fileSize;     }    }    /// <summary>    /// 当前下载大小(实时的)    /// </summary>    public int DownloadSize    {     get     {      return _downloadSize;     }    }    /// <summary>    /// 是否完成    /// </summary>    public bool IsComplete    {     get     {      return _isComplete;     }    }    /// <summary>    /// 线程数量    /// </summary>    public int ThreadNum    {     get     {      return _threadNum;     }    }    /// <summary>    /// 保存路径    /// </summary>    public string SavePath    {     get     {      return _savePath;     }     set     {      _savePath = value;     }    }    #endregion    /// <summary>    /// 构造函数    /// </summary>    /// <param name="threahNum">线程数量</param>    /// <param name="fileUrl">文件Url路径</param>    /// <param name="savePath">本地保存路径</param>    public MultiDownload(int threahNum, string fileUrl, string savePath)    {     this._threadNum = threahNum;     this._thread = new Thread[threahNum];     this._fileUrl = fileUrl;     this._savePath = savePath;    }    public void Start()    {     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_fileUrl);     HttpWebResponse response = (HttpWebResponse)request.GetResponse();     _fileSize = response.ContentLength;     int singelNum = (int)(_fileSize / _threadNum);  //平均分配     int remainder = (int)(_fileSize % _threadNum);  //获取剩余的     request.Abort();     response.Close();     for (int i = 0; i < _threadNum; i++)     {      List<int> range = new List<int>();      range.Add(i * singelNum);      if (remainder != 0 && (_threadNum - 1) == i) //剩余的交给最后一个线程       range.Add(i * singelNum + singelNum + remainder - 1);      else       range.Add(i * singelNum + singelNum - 1);      //下载指定位置的数据      int[] ran = new int[] { range[0], range[1] };      _thread[i] = new Thread(new ParameterizedThreadStart(Download));      _thread[i].Name = System.IO.Path.GetFileNameWithoutExtension(_fileUrl) + "_{0}".Replace("{0}", Convert.ToString(i + 1));      _thread[i].Start(ran);     }     //MessageBox.Show("下载完成!");    }    private void Download(object obj)    {     Stream httpFileStream = null, localFileStram = null;     try     {      int[] ran = obj as int[];      string tmpFileBlock = System.IO.Path.GetTempPath() + Thread.CurrentThread.Name + ".tmp";      _tempFiles.Add(tmpFileBlock);      HttpWebRequest httprequest = (HttpWebRequest)WebRequest.Create(_fileUrl);      httprequest.AddRange(ran[0], ran[1]);      HttpWebResponse httpresponse = (HttpWebResponse)httprequest.GetResponse();      httpFileStream = httpresponse.GetResponseStream();      localFileStram = new FileStream(tmpFileBlock, FileMode.Create);      byte[] by = new byte[5000];      int getByteSize = httpFileStream.Read(by, 0, (int)by.Length); //Read方法将返回读入by变量中的总字节数      while (getByteSize > 0)      {       Thread.Sleep(20);       lock (locker) _downloadSize += getByteSize;       localFileStram.Write(by, 0, getByteSize);       getByteSize = httpFileStream.Read(by, 0, (int)by.Length);      }      lock (locker) _threadCompleteNum++;     }     catch (Exception ex)     {      throw new Exception(ex.Message.ToString());     }     finally     {      if (httpFileStream != null) httpFileStream.Dispose();      if (localFileStram != null) localFileStram.Dispose();     }     if (_threadCompleteNum == _threadNum)     {      Complete();      _isComplete = true;     }    }    /// <summary>    /// 下载完成后合并文件块    /// </summary>    private void Complete()    {     Stream mergeFile = null;     BinaryWriter AddWriter = null;     try     {      using (mergeFile = new FileStream(@_savePath, FileMode.Create)) //根据实际情况调整FileMode      {       AddWriter = new BinaryWriter(mergeFile);       foreach (string file in _tempFiles)       {        using (FileStream fs = new FileStream(file, FileMode.Open))        {         BinaryReader TempReader = new BinaryReader(fs);         AddWriter.Write(TempReader.ReadBytes((int)fs.Length));         TempReader.Close();        }        File.Delete(file);       }      }      MyMessageBox.Show("下载完成!");     }     catch (Exception ex)     {      throw new Exception(ex.Message);     }     finally     {      if (AddWriter != null)      {       AddWriter.Close();       AddWriter.Dispose();      }      if (mergeFile != null)      {       mergeFile.Close();       mergeFile.Dispose();      }     }    }   }

以上是“C#如何实现文件上传下载功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI