首页  ·  知识 ·  编程语言
XMLHTTPRequest实现带进度条的文件上传
恩惠  CSDN博客  .NET  编辑:恩惠   图片来源:网络
通过之前的文章,我们知道XMLHTTPRequest对象是实现Ajax技术的核心,之前的博文介绍了其简单的应用,这篇文章展示通过XMLHttpRequest对象来定时监控服务器上文件上传的进度,通过进度条的形式来直观

  通过之前的文章,我们知道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
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的