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

  }

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

  注重过程的同时注重结果