源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

silverlight用webclient大文件上传的实例代码

  • 时间:2021-06-29 00:28 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:silverlight用webclient大文件上传的实例代码
客户端:
[u]复制代码[/u] 代码如下:
     /// <summary>      /// 写入数据到流中      /// </summary>      /// <param name="url"></param>      /// <param name="callback"></param>      public async static Task<bool> Write(string url, Stream clientStream)      {          if (clientStream.Length > 25*1024*1024)              url += "&t=1"; // 表示上传大文件          try          {              Up(url, clientStream);              return true;          }          catch { }          return false;      }      public async static Task Up(string url, Stream sourceStream)      {          var wc = new WebClient();          byte[] buffer = new byte[25*1024*1024];          int bufLen = sourceStream.Read(buffer, 0, buffer.Length);          if (bufLen < 1)          {              sourceStream.Close();              return;          }         wc.WriteStreamClosed += (s, e) =>          {              if (sourceStream.CanRead)                  Up(url, sourceStream);              else                  sourceStream.Close();          };          var serverStream = await wc.OpenWriteTaskAsync(url, "POST");          serverStream.Write(buffer, 0, bufLen);          serverStream.Close();      }
服务端:
[u]复制代码[/u] 代码如下:
private void Save()        {            string data = Context.Request.QueryString["data"].Base64StringDecode("ABC");            if (data.IsNullOrEmpty())                return;            var m = JsonConvert.DeserializeObject<FileUploadModel>(data);            if (m == null)                return;            var isSplitBlock = Context.Request.QueryString["t"]=="1";   //是否分块上传            #region 保存文件            // 初始化目录            string dirPath = Path.Combine(ConfigHelper.UploadPath, m.Dir);   // 文件保存路径            if (!Directory.Exists(dirPath))                Directory.CreateDirectory(dirPath);            // 文件地址            string filePath = Path.Combine(dirPath, m.FileName);            if (!isSplitBlock)            {                if (File.Exists(filePath))                    File.Delete(filePath);            }            int bufLen = 0;            byte[] buffer = new byte[4096];            using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))            {                fs.Seek(0, SeekOrigin.End);                // 写入原文件                Stream sr = Context.Request.InputStream;                while ((bufLen = sr.Read(buffer, 0, buffer.Length)) > 0)                    fs.Write(buffer, 0, bufLen);                sr.Close();                sr.Dispose();                // 缩略图                try                {                    if (!m.NeedThumbnail)                        return;                    dirPath = Path.Combine(dirPath, "Small");                    if (!Directory.Exists(dirPath))                        Directory.CreateDirectory(dirPath);                    filePath = Path.Combine(dirPath, m.FileName);                    if (File.Exists(filePath))                        File.Delete(filePath);                    using (var pic = GetThumbnail(fs, 300, 300))                    {                        pic.Save(filePath);                    }                }                catch { }            }            #endregion            #region 删除原文件            // 删除原文件            if (m.OldFilePath.IsNullOrEmpty())            {                return;            }            try            {                filePath = Path.Combine(ConfigHelper.UploadPath, m.OldFilePath);                if (File.Exists(filePath))                    File.Delete(filePath);                if (m.NeedThumbnail)                {                    filePath = Path.Combine(ConfigHelper.UploadPath, m.OldThumbnailImagePath);                    if (File.Exists(filePath))                        File.Delete(filePath);                }            }            catch (Exception ex)            {            }            #endregion        }
分块上传注意点:每块流保存完以后再去读取下以块的数据,不然会多块一起过来会前面的块流数据会被后面的块流数据覆盖; 注重过程的同时注重结果
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部