FutureWindow uploading...

public class FileUploadThread
 {
  public FileUploadThread()
  {
  }
  //
  // TODO: 在此处添加构造函数逻辑
  //
  private long _bytesRead;
  private Thread _tID;
  private string _filename;
  private Stream _stream;
  private bool _uploaded;
  private Exception _exception;

  /// <summary>
  /// 已经上传的字节数
  /// </summary>
  public long BytesRead { get { return _bytesRead; } }
  
  /// <summary>
  /// 上传数据的长度
  /// </summary>
  public long Length { get { return _stream.Length; } }
  
  /// <summary>
  /// 判断上传是否已经完成
  /// </summary>
  public bool Uploaded { get { return _uploaded; } }
  
  /// <summary>
  /// 已经上传的百分比
  /// </summary>
  public int Percent { get { return (int) ((BytesRead * 100) / Length); } }

  /// <summary>
  /// 异常对象,null表示没有异常null.
  /// </summary>
  public Exception Exception { get { return _exception; } }

  /// <summary>
  /// 构造函数,初始化域、创建上传线程
  /// </summary>
  /// <param name="filename">带路径的文件名</param>
  /// <param name="stream">上传数据的流 (例如. .PostedFile.InputStream)</param>
  public FileUploadThread(string filename, Stream stream)
  {
   _filename = filename;
   _stream = stream;
   _uploaded = false;
   _exception = null;

   _tID = new Thread(new ThreadStart(uploadThread) );
   _tID.Start();
  }

  /// <summary>
  /// Cancel upload's
  /// </summary>
  public void Cancel()
  {
   _tID.Abort();
  }

  /// <summary>
  /// Main thread procedure
  /// </summary>
  private void uploadThread()
  {
   byte[] b = new byte[1024];//1k的数据
   int read = 0;

   try
   {
    using (FileStream fs = new FileStream(_filename, FileMode.Create))
    {
     while ((read = _stream.Read(b, 0, b.Length)) > 0)
     {
      fs.Write(b, 0, read);
      _bytesRead += read;
      System.Threading.Thread.Sleep(100);
     }
    }
   }
   catch (Exception ex)
   {
    _exception = ex;
   }
   _uploaded = true;
  }
 }
public enum PageMode { UploadForm, Uploading, Result }

  public PageMode pageMode
  {
   get
   {
    object o = ViewState["pageMode"];
    return (o==null) ? PageMode.UploadForm : (PageMode) o;
   }
   set
   {
    ViewState["pageMode"] = value;
    switch (value)
    {
     case PageMode.UploadForm: 
      panResult.Visible = panInfo.Visible = !(panUpload.Visible = true); break;
     case PageMode.Uploading:
      litRefreshJS.Text = String.Format("<script>setTimeout(/"{0}/", {1});</script>", Page.GetPostBackClientEvent(btnRefresh, ""), RefreshTime);
      panResult.Visible = panUpload.Visible = !(panInfo.Visible = true);
      panProgressBar.Width = 0;
      break;
     case PageMode.Result:
      litRefreshJS.Text = "";
      Session.Remove("FileUploadThread");
      panUpload.Visible = panInfo.Visible = !(panResult.Visible = true);
      break;
    }
   }
  }

晚上又改进了一下futurewindow
加了上传图片进度条查看功能
准备工作:
1。在aspx中用3个panel
panel1。用户选择图片
panel2。显示进度条。进度条也是一个红色固定宽度的panel
panel3。显示上传结果
2。在aspx。cs中加入一个属性
Pagemode来决定3个panel怎么显示以及在panel2里面用setTimeOut实现进度条
业务逻辑:
用户选了图片,点了确定
创建一个线程,同时把怕gemode改为uploading,这时就有一个settimeout了
settimeout的执行函数是 Page.GetPostBackClientEvent(btnRefresh, "")
就是激活btnRefresh
btnRefresh的功能:判断如果还在上传就修改进度条的长度,以及上传完毕就转到panel3,里面有settimeout激活它自己。
线程的功能:实现图片文件的上传
其中构造函数public FileUploadThread(string filename, Stream stream)
第一个参数为服务器上目的文件的完整路径,第二个参数为本地欲上传文件的read流

想了想
futurewindow还可以继续完善
加入图片库功能
在做杂志page的时候不一定要上传图片,可以选择系统的图片库
当然特别是在做两个page特殊效果的时候这个方案更节省服务器空间
有时间就把这个功能做了吧
不过要大改系统架构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值