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特殊效果的时候这个方案更节省服务器空间
有时间就把这个功能做了吧
不过要大改系统架构。