<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C# HTTP實現斷點續傳客戶端和服務端

      一、開篇描述

      本篇博客所描述的斷點續傳功能是基于c#語言,服務器端采用.net mvc框架,客戶端采用winform框架。

      本篇博客實現斷點續傳功能的基本思路:1)服務器端是把接收到的文件流,追加到已有的文件;2)客戶端是把文件流截段上傳;

      其實,任何一種計算機語言基于這個思路(web客戶端JavaScript目前例外),都可以實現斷點續傳的功能。

      二、服務器端

      namespace MvcApplicationUpload.Controllers
      {
          public class HomeController : Controller
          {
              /// <summary>
              /// Index
              /// </summary>
              /// <returns></returns>
              public ActionResult Index()
              {
                  //string ip = Request.UserHostAddress;
                  //string port = Request.ServerVariables["REMOTE_PORT"].ToString();
                  return View();
              }
       
              /// <summary>
              /// Test
              /// </summary>
              /// <returns></returns>
              public ActionResult Test()
              {
                  return PartialView();
              }
       
              /// <summary>
              /// 獲取續傳點。
              /// </summary>
              /// <param name="md5Name"></param>
              /// <returns></returns>
              public string GetFileResumePoint(string md5Name)
              {
                  var saveFilePath = Server.MapPath("~/Images/") + md5Name;
                  if (System.IO.File.Exists(saveFilePath))
                  {
                      var fs = System.IO.File.OpenWrite(saveFilePath);
                      var fsLength = fs.Length.ToString();
                      fs.Close();
                      return fsLength;
                  }
                  return "0";
              }
       
              /// <summary>
              /// 文件續傳。
              /// </summary>
              /// <returns></returns>
              [HttpPost]
              public HttpResponseMessage FileResume()
              {
                  var md5Name = Request.QueryString["md5Name"];
                  var fileStream = Request.InputStream;
                  var contentRange = Request.Headers["Content-Range"];//contentRange樣例:bytes 0-1000/5000
                  SaveAs(Server.MapPath("~/Images/") + md5Name, fileStream, contentRange);
                  return new HttpResponseMessage(HttpStatusCode.OK);
              }
       
              /// <summary>
              /// 給已有文件追加文件流。
              /// </summary>
              /// <param name="saveFilePath"></param>
              /// <param name="stream"></param>
              private void SaveAs(string saveFilePath, System.IO.Stream stream, string contentRange)
              {
                  //接收到的碎片字節流信息。
                  long startPosition = 0;
                  long endPosition = 0;
                  if (!string.IsNullOrEmpty(contentRange))
                  {
                      contentRange = contentRange.Replace("bytes", "").Trim();
                      contentRange = contentRange.Substring(0, contentRange.IndexOf("/"));
                      string[] ranges = contentRange.Split('-');
                      startPosition = long.Parse(ranges[0]);
                      endPosition = long.Parse(ranges[1]);
                  }
                  else
                  {
                      return;
                  }
                  //默認寫針位置。
                  System.IO.FileStream fs;
                  long writeStartPosition = 0;
                  if (System.IO.File.Exists(saveFilePath))
                  {
                      fs = System.IO.File.OpenWrite(saveFilePath);
                      writeStartPosition = fs.Length;
                  }
                  else
                  {
                      fs = new System.IO.FileStream(saveFilePath, System.IO.FileMode.Create);
                  }
                  //調整寫針位置。
                  if (writeStartPosition >= endPosition)
                  {
                      fs.Close();
                      return;
                  }
                  else if (writeStartPosition < startPosition)
                  {
                      fs.Close();
                      return;
                  }
                  else if (writeStartPosition > startPosition && writeStartPosition < endPosition)
                  {
                      writeStartPosition = startPosition;
                  }
                  fs.Seek(writeStartPosition, System.IO.SeekOrigin.Current);
                  //向文件追加文件流。
                  byte[] nbytes = new byte[512];
                  int nReadSize = 0;
                  while ((nReadSize = stream.Read(nbytes, 0, 512)) > 0)
                  {
                      fs.Write(nbytes, 0, nReadSize);
                  }
                  fs.Close();
              }
       
          }
      }

      三、客戶端

      1 界面如下:

      2 代碼如下:

      namespace WindowsFormsApplicationUpload
      {
          public partial class Form1 : Form
          {
              /// <summary>
              /// 定義委托。
              /// </summary>
              /// <param name="text"></param>
              delegate void ChangeText(string text);
       
              /// <summary>
              /// 暫停標記。
              /// </summary>
              int flag = 0;
       
              /// <summary>
              /// 上傳的文件路徑。
              /// </summary>
              string filePath;
       
              /// <summary>
              /// 上傳的文件md5值。
              /// </summary>
              string md5Str;
       
              /// <summary>
              /// 上傳的文件續傳點。
              /// </summary>
              long startPoint;
       
              public Form1()
              {
                  InitializeComponent();
              }
       
              /// <summary>
              /// 委托方法。
              /// </summary>
              /// <param name="text"></param>
              public void ChangeLabelText(string text)
              {
                  this.label1.Text = text;
              }
       
              /// <summary>
              /// 得到文件的MD5值。
              /// </summary>
              /// <param name="filePath"></param>
              /// <returns></returns>
              public string GetFileMd5(string filePath)
              {
                  MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                  FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                  Byte[] hashBytes = md5.ComputeHash(fs);
                  fs.Close();
                  return BitConverter.ToString(hashBytes).Replace("-", "");
              }
       
              /// <summary>
              /// 得到文件的續傳點。
              /// </summary>
              /// <param name="md5Str"></param>
              /// <param name="fileExtension"></param>
              /// <returns></returns>
              public long GetFileResumePoint(string md5Str, string fileExtension)
              {
                  System.Net.WebClient webClient = new System.Net.WebClient();
                  string urlStr = "http://127.0.0.1/Home/GetFileResumePoint?md5Name=" + md5Str + fileExtension;
                  byte[] infoBytes = webClient.DownloadData(urlStr);
                  string result = System.Text.Encoding.UTF8.GetString(infoBytes);
                  webClient.Dispose();
                  if (string.IsNullOrEmpty(result))
                  {
                      return 0;
                  }
                  return Convert.ToInt64(result);
              }
       
              public void ResumeFileThread()
              {
                  MessageBox.Show(ResumeFile("http://127.0.0.1/Home/FileResume", filePath, startPoint, 1024 * 128, md5Str));
              }
       
              public string ResumeFile(string hostUrl, string filePath, long startPoint, int byteCount, string md5Str)
              {
                  string result = "上傳成功!";
                  if (startPoint < 0)
                  {
                      result = "指針有誤!";
                      return result;
                  }
                  FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                  long fileLength = fs.Length;
                  if (startPoint >= fileLength)
                  {
                      result = "文件秒傳!";
                      return result;
                  }
       
                  byte[] data;
                  System.Net.WebClient webClient = new System.Net.WebClient();
                  BinaryReader bReader = new BinaryReader(fs);
                  try
                  {
                      #region 續傳處理
                      if (startPoint >= 1 && startPoint < fileLength)
                      {
                          fs.Seek(startPoint, SeekOrigin.Current);
                      }
                      #endregion
                      #region 分割文件上傳
                      int step = byteCount;
                      for (; startPoint < fileLength; startPoint += step)
                      {
                          if (startPoint + byteCount > fileLength)
                          {
                              step = Convert.ToInt32(fileLength - startPoint);
                              data = new byte[step];
                              bReader.Read(data, 0, step);
                          }
                          else
                          {
                              data = new byte[byteCount];
                              bReader.Read(data, 0, byteCount);
                          }
                          webClient.Headers.Set(HttpRequestHeader.ContentRange, "bytes " + startPoint + "-" + (startPoint + step) + "/" + fs.Length);
                          webClient.UploadData(hostUrl + "?md5Name=" + md5Str + Path.GetExtension(filePath), "POST", data);
                          this.BeginInvoke(new ChangeText(ChangeLabelText), (startPoint + step) + "/" + fileLength);
                      pause:
                          if (flag == 1)
                          {
                              Thread.Sleep(1000);
                              goto pause;
                          }
                      }
                      #endregion
                  }
                  catch (Exception ex)
                  {
                      result = ex.Message;
                  }
                  finally
                  {
                      bReader.Close();
                      fs.Close();
                      webClient.Dispose();
                  }
                  return result;
              }
       
              /// <summary>
              /// 上傳按鈕點擊事件。
              /// </summary>
              /// <param name="sender"></param>
              /// <param name="e"></param>
              private void button1_Click(object sender, EventArgs e)
              {
                  OpenFileDialog openFileDialog = new OpenFileDialog();
                  if (openFileDialog.ShowDialog() == DialogResult.OK)
                  {
                      filePath = openFileDialog.FileName;
                      md5Str = GetFileMd5(filePath);
                      startPoint = GetFileResumePoint(md5Str, Path.GetExtension(filePath));
                      ThreadStart ts = new ThreadStart(ResumeFileThread);
                      Thread t = new Thread(ts);
                      t.Start();
                  }
              }
       
              /// <summary>
              /// 暫停按鈕點擊事件。
              /// </summary>
              /// <param name="sender"></param>
              /// <param name="e"></param>
              private void button2_Click(object sender, EventArgs e)
              {
                  flag = 1;
              }
       
              /// <summary>
              /// 繼續按鈕點擊事件。
              /// </summary>
              /// <param name="sender"></param>
              /// <param name="e"></param>
              private void button3_Click(object sender, EventArgs e)
              {
                  flag = 0;
              }
       
              /// <summary>
              /// 拖拽上傳。
              /// </summary>
              /// <param name="sender"></param>
              /// <param name="e"></param>
              private void Form1_Drag(object sender, DragEventArgs e)
              {
                  if (e.Data.GetDataPresent(DataFormats.FileDrop))
                  {
                      string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];
                      MessageBox.Show("準備上傳" + files.Length + "個文件!");
                      foreach (string file in files)
                      {
                          MessageBox.Show("開始上傳文件:" + file);
                          filePath = file;
                          md5Str = GetFileMd5(filePath);
                          startPoint = GetFileResumePoint(md5Str, Path.GetExtension(filePath));
                          ThreadStart ts = new ThreadStart(ResumeFileThread);
                          Thread t = new Thread(ts);
                          t.Start();
                      }
                  }
              }
       
              private void Form1_DragDrop(object sender, DragEventArgs e)
              {
                  //Form1_Drag(sender, e);
              }
       
              private void Form1_DragOver(object sender, DragEventArgs e)
              {
                  Form1_Drag(sender, e);
              }
       
          }
      }
      來源:https://blog.csdn.net/qq_18932003/article/details/120521365

       

      posted @ 2024-12-09 19:00  【君莫笑】  閱讀(153)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美综合自拍亚洲综合图| 亚洲综合精品第一页| 亚洲国产成人AⅤ片在线观看| 日夜啪啪一区二区三区| 日韩黄色av一区二区三区 | 国产精品自拍午夜福利| 国产精品自在自线视频| 国产色无码专区在线观看| 亚洲天堂男人天堂女人天堂| 亚洲性线免费观看视频成熟| 中文字幕久久国产精品| 亚洲成av人片天堂网| 日本一区二区不卡精品| 中文字幕亚洲一区二区va在线| 无码av人片在线观看天堂| 久久精品一本到99热免费| 丝袜美腿一区二区三区| 午夜福利yw在线观看2020| 人妻少妇精品视频专区| 国产精品免费看久久久| 亚洲男人电影天堂无码| 熟妇人妻任你躁在线视频| 天堂网亚洲综合在线| 精品乱人伦一区二区三区| 一区二区三区激情免费视频| 欧美老熟妇乱子伦牲交视频| 18禁黄无遮挡网站免费| 在线看高清中文字幕一区| 波多野结衣久久一区二区| 人妻av中文字幕无码专区| 起碰免费公开97在线视频| 色婷婷狠狠久久综合五月| 3d全彩无码啪啪本子全彩| 精品一区二区三区不卡| 内射毛片内射国产夫妻| 国产色悠悠在线免费观看| 欧美成人午夜在线观看视频| 台南县| 激情五月日韩中文字幕| 日本怡春院一区二区三区| 宁城县|