华域联盟 .Net silverlight用webclient大文件上传的实例代码

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

客户端:

复制代码 代码如下:

     /// <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();

     }

服务端:

复制代码 代码如下:

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

       }

分块上传注意点:每块流保存完以后再去读取下以块的数据,不然会多块一起过来会前面的块流数据会被后面的块流数据覆盖;

注重过程的同时注重结果

您可能感兴趣的文章:

  • 用WebClient.UploadData方法上载文件数据的方法
  • Silverlight中同步调用WebClient的解决办法,是同步!
  • C#中在WebClient中使用post发送数据实现方法
  • 基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例
  • C# WebClient类用法实例
  • C# webclient中文乱码问题解决方法

本文由 华域联盟 原创撰写:华域联盟 » silverlight用webclient大文件上传的实例代码

转载请保留出处和原文链接:https://www.cnhackhy.com/52091.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部