1、前台代码FileProcessBar.aspx:
<%@ page Language="C#" AutoEventWireup="true" CodeFile="FileProcessBar.aspx.cs" EnableEventValidation="false" Inherits="FileProcessBar" %> <!DOCTYpE html pUBLIC "-//W3C//Dtd XHTML 1.0 transitional//EN" "http://www.w3.org/tr/xhtml1/Dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script language="javascript" type="text/javascript"> function checkFile(source, arguments) { arguments.IsValid = (document.all["theFile"].value != ""); } </script> <style type="text/css"> .style1 { width: 500px; } .style2 { width: 48px; } .style3 { width: 81px; } </style> </head> <body> <form id="form1" runat="server"> <table align="center" class="style1"> <tr> <td> <asp:HyperLink id="lnkReload" runat="server" NavigateUrl="FileprocessBar.aspx" Font-Bold="true">重新载入页面</asp:HyperLink> </td> </tr> </table> <asp:panel id="panUpload" runat="server"> <table align="center" class="style1"> <tr> <td colspan="2" >请选择你要上载的文件:</td> </tr> <tr> <td align="right" class="style2" >文件:</td> <td > <input id="theFile" style="WIDTH: 100%" type="file" name="theFile" runat="server" /> </td> </tr> <tr> <td align="right" class="style2" ></td> <td> <asp:CustomValidator ID="cusValTheFile" runat="server" ClientValidationFunction="checkFile" Display="Dynamic" ErrorMessage="你必须选择你上载的<b>文件</b>。"></asp:CustomValidator> </td> </tr> <tr> <td align="right" class="style2" >描述:</td> <td> <asp:TextBox ID="edInfo" runat="server" Width="100%"></asp:TextBox> </td> </tr> <tr> <td align="right" class="style2"></td> <td> <asp:RequiredFieldValidator ID="reqValInfo" runat="server" ControlToValidate="edInfo" Display="Dynamic" ErrorMessage="文件的 "<b>描述</b>" 不能为空,请输入一些信息。"></asp:RequiredFieldValidator> </td> </tr> <tr> <td align="right" class="style2" ></td> <td> <asp:CheckBox ID="chbImportant" runat="server" Text="重要" /> </td> </tr> <tr> <td align="right" class="style2" > </td> <td> <asp:Button ID="btnUpload" runat="server" onclick="btnUpload_Click" Text="上载" Width="64px" /> </td> </tr> </table> <br/> </asp:panel> <asp:panel id="panInfo" runat="server"> <table align="center" class="style1"> <tr> <td align="right" width="100" colspan="2" style="width: 500px; text-align: left" > <asp:LinkButton ID="btnRefresh" runat="server" onclick="btnRefresh_Click" style="text-align: left" Visible="False">上载图像...</asp:LinkButton> </td> </tr> <tr> <td align="right" class="style3" > 文件名称:</td> <td width="400"> <asp:Label ID="lblFilename" runat="server" Font-Bold="true"></asp:Label> </td> </tr> <tr> <td align="right" class="style3" >进程条:</td> <td width="400" > <asp:Label id="lblProgress" runat="server" Font-Bold="True"></asp:Label></td> </tr> <tr> <td align="right" class="style3" ></td> <td width="400" > <asp:Image ID="panProgressBar" runat="server" ImageUrl="~/images/1.JPG" Height="20px" /> </td> </tr> <tr> <td align="right" class="style3" ></td> <td width="400"> <asp:Button id="btnCancel" runat="server" Width="64px" Text="取消" onclick="btnCancel_Click"></asp:Button></td> </tr> </table> </asp:panel> <asp:Panel id="panResult" runat="server"> <table align="center" class="style1"> <tr> <td><asp:Label ID="lblResult" runat="server"></asp:Label> </td> </tr> <tr> <td> <asp:HyperLink ID="lbkReturn" runat="server" NavigateUrl="FileprocessBar.aspx">返回上载页面</asp:HyperLink> </td> </tr> </table> </asp:Panel> <table align="center" class="style1"> <tr> <td> <asp:Literal id="litRefreshJS" runat="server"></asp:Literal> </td> </tr> </table> </form> </body> </html>
2、后台代码FileProcessBar.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
public partial class FileProcessBar : System.Web.UI.Page
{
// determin how often Progress Info will be refreshed
const int RefreshTime = 0;
// determine, which panel to show
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:
// initialize fields
litRefreshJS.Text = String.Format("<script>setTimeout(\"{0}\", {1});</script>", ClientScript.GetPostBackEventReference( btnRefresh, ""), RefreshTime);
panResult.Visible = panUpload.Visible = !(panInfo.Visible = true);
panProgressBar.Width = 0;
break;
case PageMode.Result:
// result information
litRefreshJS.Text = "";
Session.Remove("FileUploadThread");
panUpload.Visible = panInfo.Visible = !(panResult.Visible = true);
break;
}
}
}
// how many bytes has been uploaded.
public long BytesRead
{
get { object o = ViewState["BytesRead"]; return (o == null) ? 0 : (long)o; }
set { ViewState["BytesRead"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["FileUploadThread"] != null)
{
// this users has the session, possible there's an unfinished file upload
lblResult.Text = "文件正在上载过程中……";
litRefreshJS.Text = "";
pageMode = PageMode.Result;
}
else pageMode = PageMode.UploadForm;
}
}
protected void btnUpload_Click(object sender, EventArgs e)
{
if (theFile.PostedFile.ContentLength == 0) return;
lblFilename.Text = Path.GetFileName(theFile.PostedFile.FileName);
lblProgress.Text = String.Format("{0} of {1} bytes (0 %)", 0, theFile.PostedFile.InputStream.Length);
string dir = MapPath("files/");
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
Session["FileUploadThread"] = new FileUploadThread(dir + lblFilename.Text, theFile.PostedFile.InputStream);
pageMode = PageMode.Uploading;
}
protected void btnCancel_Click(object sender, EventArgs e)
{
FileUploadThread fut = (FileUploadThread)Session["FileUploadThread"];
if (fut != null) fut.Cancel();
lblResult.Text = "上载文件已经被取消!";
pageMode = PageMode.Result;
}
protected void btnRefresh_Click(object sender, EventArgs e)
{
FileUploadThread fut = (FileUploadThread)Session["FileUploadThread"];
if (!fut.Uploaded)
{
litRefreshJS.Text = String.Format("<script>setTimeout(\"{0}\", {1});</script>", ClientScript.GetPostBackEventReference(btnRefresh, ""), RefreshTime);
lblProgress.Text = String.Format("{0} of {1} bytes ({2} %)", fut.BytesRead,fut.Length,fut.Percent);
panProgressBar.Width = 2 * fut.Percent;
panProgressBar.Height = 20;
}
else
{
if (fut.Exception == null)
lblResult.Text = String.Format("\"<a href='files/{0}'>{0}</a>\" 文件上载成功!<br/>文件是:{1}<br/>描述是:{2}", lblFilename.Text, (chbImportant.Checked) ? "重要的" : "不重要的", edInfo.Text);
else
lblResult.Text = String.Format("上载文件错误,错误信息如下: {0}<br>{1}", fut.Exception.GetType(), fut.Exception.Message);
pageMode = PageMode.Result;
}
}
}
3、类文件FileUploadThread.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Threading; using System.IO; /// <summary> ///FileUploadThread 的摘要说明 /// </summary> public class FileUploadThread { private string _filename; private Stream _stream; private bool _uploaded; private Exception _exception; private Thread _tID; private int _bytesRead; private int _length; private int _percent; public FileUploadThread(string filename,Stream stream) { // //TODO: 在此处添加构造函数逻辑 // _filename = filename; _stream = stream; _length = (int)_stream.Length; _uploaded = false; _exception = null; _tID = new Thread(new ThreadStart(uploadThread)); _tID.Start(); } public void Cancel() { if (_tID.IsAlive) { _tID.Abort(); } } public bool Uploaded { get { return _uploaded; } set { _uploaded = value; } } public Exception Exception { get { return _exception; } set { _exception = value; } } public int BytesRead { get { return _bytesRead; } set { _bytesRead = value; } } public int Length { get { return _length ; } set { _length = value; } } public int Percent { get { return _percent ; } set { _percent = value; } } private void uploadThread() { byte[] b=new byte[1024]; 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 ; _percent = (int)(_bytesRead*100 /_length); System.Threading.Thread.Sleep(1000); } } } catch(Exception ex){_exception=ex;} _uploaded=true ; } }
4、运行结果如下:
5、本程序调试环境为VS2010