通过之前的文章,我们知道XMLHTTPRequest对象是实现Ajax技术的核心,之前的博文介绍了其简单的应用,这篇文章展示通过XMLHttpRequest对象来定时监控服务器上文件上传的进度,通过进度条的形式来直观的反映上传的情况。
下面是详细的介绍:
1.文件上传还是使用传统的Form表单进行上传,不过将上传页面单独做一个页面FileUpload.aspx.在这个页面Page指令我们设置EnableSessionState="ReadOnly",让其他页面可以读取Session的值.
我们新建一个UploadInfo类来保存上传文件的相关信息
public class UploadInfo
{
/// <summary>
/// 指示文件是否已经准备好上传
/// </summary>
public bool IsReady { get; set; }
/// <summary>
/// 文件总的大小
/// </summary>
public long ContentLength { get; set; }
/// <summary>
/// 文件已上传大小
/// </summary>
public long UploadedLength { get; set; }
/// <summary>
/// 文件名
/// </summary>
public string FileName { get; set; }
}
FileUpload.aspx前台代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUpload.aspx.cs" Inherits="ASP.NET实验项目.FileUpload" EnableSessionState="ReadOnly"%>
<%--EnableSessionState="ReadOnly"--可以读取但不能更改会话状态,需要设置为ReadOnly,否则得不到更新的值 EnableSessionState="ReadOnly" --%>
<!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>
</head>
<body>
<%--指定action=FileUpload.aspx会将数据提交到FileUpload.aspx处理程序--%>
<form id="form" method="post" enctype="multipart/form-data" action="FileUpload.aspx">
<input id="FileUpload1" type="file" style="width:100%;" runat="server" />
</form>
</body>
</html>
在前台我们看到action="FileUpload.aspx",文件上传后相关的处理程序会在该页面的后台进行,我们在后台行开辟一个线程来处理上传的文件,代码如下:
public partial class FileUpload : System.Web.UI.Page
{
private Thread uploadThread = null; //处理文件上传的线程
HttpPostedFile postFile = null; //对当前客户端已经上载文件的访问对象
UploadInfo upload = null; //文件信息保存类
string path = null; //文件保存路径
protected void Page_Load(object sender, EventArgs e)
{
if(Request.Files.Count>=1)
{
postFile = Request.Files[0];
upload = HttpContext.Current.Session["ReadFile"] as UploadInfo;
//设置路径(上传文件保存的路径)
path = HttpContext.Current.Server.MapPath(@"Uploads");
//开启uploadThread子线程进行文件的上传
uploadThread = new Thread(new ThreadStart(RequestUploadFiles));
Session["UploadThread"] = uploadThread;
uploadThread.Name = "UploadFile_Thread";
//设置线程的优先级
uploadThread.Priority = ThreadPriority.BelowNormal;
uploadThread.Start();
}
}
//处理文件上传的方法
private void RequestUploadFiles()
{
upload.IsReady = false; //文件上传还没准备好
//如果控件中已经加载文件,并且该文件有大小
if (postFile.ContentLength > 0)
{
//包含目录和文件名
string fileName = Path.GetFileName(postFile.FileName);
//设置文件的信息
upload.ContentLength = postFile.ContentLength;
upload.FileName = fileName;
upload.UploadedLength = 0; //文件已上传部分为0
//文件存在,进行初始化(文件已经准备好)
upload.IsReady = true;
//设置缓存32KB
int bufferSize = 1024 << 4;
byte[] buffer = new byte[bufferSize];
//一次读取到字节数
int readcount;
//创建文件流
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.Create))
{
while (upload.UploadedLength < upload.ContentLength)
{
//从读取上传文件的内容
readcount = postFile.InputStream.Read(buffer, 0, bufferSize);
//字节写入文件流
fs.Write(buffer, 0, readcount);
//更新大小
upload.UploadedLength += readcount;
//让程序暂时休眠,更加直观的显示进度条
Thread.Sleep(1);
}
}
}
}
}
本文作者:恩惠 来源:CSDN博客
CIO之家 www.ciozj.com 微信公众号:imciow