首页 > 代码库 > EXTJS+ASP.NET上传文件带实时进度条代码

EXTJS+ASP.NET上传文件带实时进度条代码

一,文件夹

二,upLoad.cs是继承IHttpModule的类:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;using System.IO;using System.Reflection;using System.Globalization;using System.Web.Hosting;/// <summary>///upLoad 的摘要说明/// </summary>public class upLoad : IHttpModule{    public void Init(HttpApplication application)    {        application.BeginRequest += new EventHandler(this.Application_BeginRequest);    }    #region 用户变量    private Encoding eContentEncode;//HTTP上下文的编码    private bool bReadDataFinished = true;//用于表示上一个文件是否读取完毕,是否可以开始新文件的读取    private HttpApplication app;//HttpApplication 类的一个实例在其生存期内被用于处理多个请求    private byte[] bboundary;//界限数组 如:“-----------------------------7d87d1cc0a88”    private byte[] bendboundary;    private byte[] brequest;//没有文件信息的HTTP请求上下文字节数组    private byte[] temp;//临时字节数组,用来存放上一次截取的一部分字节    // private int ufiFileInfo.strFileGuid;//子集数,用来给文件命名    #endregion    void Application_BeginRequest(object sender, EventArgs e)    {        app = sender as HttpApplication;        if (app == null) return;        string ContentType = app.Request.ContentType;//类型共两种1(默认是application/x-www-form-urlencoded)上传是(multipart/form-data)        //判断是否为上传文件类型        if (string.Compare(ContentType, 0, "multipart/form-data", 0, "multipart/form-data".Length, true) != 0) return;        int iReadStepSize = 7600;//分块读取数据的大小        int iContentLength = app.Request.ContentLength;//文件总长度(不包括HTTP请求头)        //声明一个具体的当前HTTP请求实例        IServiceProvider provider = (IServiceProvider)HttpContext.Current;        HttpWorkerRequest request = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));        eContentEncode = app.Request.ContentEncoding;//获取请求编码类型        byte[] bPreloadedEnitityBody = request.GetPreloadedEntityBody();//获取HTTP请求已经被读取的部分        bboundary = GetMultipartBoundary(app.Request.ContentType);//获取分界的数组(包含分界前的换行符)        bendboundary = GetEndBoundary(app.Request.ContentType);        temp = null;        brequest = null;        //   ufiFileInfo.strFileGuid = 0;        int iRead = request.GetPreloadedEntityBodyLength();//已经读取的字节数        string filename = null;//文件重命名        string sguid = GetUploadId(bPreloadedEnitityBody, eContentEncode);        UploadFileInfo ufiFileInfo = (UploadFileInfo)HttpContext.Current.Cache[sguid];        ufiFileInfo.iTotalBytes = iContentLength;        int iLeave = iContentLength - iRead;//剩余未读取的字节数        //将读取的数据写入缓冲区然后再写入文件         bool bGoOnGetFileFromThisByte = true;        if (bReadDataFinished)//判断是否是第一次读取数据        {            //判断是否有文件数据头            int iDataStart1 = 0, iDataStart2 = 0, iDataStart3 = 0, iEndStart = 0;            //判断是否含有“filename=”字段            byte[] b1 = eContentEncode.GetBytes("filename=");            int iStartIndex = 0, iEndIndex = bPreloadedEnitityBody.Length - 1;            while (iStartIndex <= iEndIndex)            {                int i = -1;//判断是否找到完全匹配                iStartIndex = Array.IndexOf(bPreloadedEnitityBody, b1[0], iStartIndex + 1);                //如果没有找到                if (iStartIndex < 0)                {                    break;                }                for (int index = 1; index < b1.Length; index++)                {//对剩余字节进行逐个匹配                    if (iStartIndex + index > bPreloadedEnitityBody.Length - 1)                    {//超出范围                        break;                    }                    if (bPreloadedEnitityBody[iStartIndex + index] != b1[index])                    {                        //如果不匹配                        break;                    }                    i = 0;                }                if (i == 0)                {                    iDataStart1 = iStartIndex + 9;                    break;                }            }            //获取\r\nContent-Type: text/plain            byte[] b2 = eContentEncode.GetBytes("\r\n");            iStartIndex = iDataStart1;            while (iStartIndex <= iEndIndex)            {                int i = -1;                iStartIndex = Array.IndexOf(bPreloadedEnitityBody, b2[0], iStartIndex);                if (iStartIndex < 0)                {                    break;                }                for (int index = 1; index < b2.Length; index++)                {//对剩余字节进行逐个匹配                    if (iStartIndex + index > bPreloadedEnitityBody.Length - 1)                    {//超出范围                        break;                    }                    if (bPreloadedEnitityBody[iStartIndex + index] != b2[index])                    {                        //如果不匹配                        break;                    }                    i = 0;                }                if (i == 0)                {                    iDataStart2 = iStartIndex + 2;                    break;                }            }            //获取文件开始处的位置            iStartIndex = iDataStart2;            while (iStartIndex <= iEndIndex)            {                int i = -1;                iStartIndex = Array.IndexOf(bPreloadedEnitityBody, b2[0], iStartIndex);                if (iStartIndex < 0)                {                    break;                }                for (int index = 1; index < b2.Length; index++)                {//对剩余字节进行逐个匹配                    if (iStartIndex + index > bPreloadedEnitityBody.Length - 1)                    {//超出范围                        break;                    }                    if (bPreloadedEnitityBody[iStartIndex + index] != b2[index])                    {                        //如果不匹配                        break;                    }                    i = 0;                }                if (i == 0)                {                    iDataStart3 = iStartIndex + 4;//因为有两个换行所以加4                    break;                }            }            //获取文件重命名filename            int iStartTxtname = 0, iEndTxtname = 0;            iStartIndex = 0;            //获取name=“txtname”在数据头中的位置            byte[] txtname = eContentEncode.GetBytes("txtname\"");            while (iStartIndex <= iEndIndex)            {                int i = -1;                iStartIndex = Array.IndexOf(bPreloadedEnitityBody, txtname[0], iStartIndex + 1);                if (iStartIndex < 0)                {                    break;                }                for (int index = 1; index < txtname.Length; index++)                {                    if (bPreloadedEnitityBody[iStartIndex + index] != txtname[index])                    {                        break;                    }                    i = 0;                }                if (i == 0)                {                    iStartTxtname = iStartIndex + txtname.Length + 4;//加4是因为有两个\r\n                    break;                }            }            while (iStartTxtname <= iEndIndex)            {                int i = -1;                iStartIndex = Array.IndexOf(bPreloadedEnitityBody, b2[0], iStartTxtname + 1);                if (iStartIndex < 0)                {                    break;                }                for (int index = 1; index < b2.Length; index++)                {                    if (bPreloadedEnitityBody[iStartIndex + index] != b2[index])                    {                        break;                    }                    i = 0;                }                if (i == 0)                {                    iEndTxtname = iStartIndex;                    break;                }            }            filename = eContentEncode.GetString(bPreloadedEnitityBody, iStartTxtname, iEndTxtname - iStartTxtname);            ufiFileInfo.StrFileName = filename;            //开始写文件            ufiFileInfo.IFileStart = iDataStart3;            //获取后缀名            ufiFileInfo.strExtensionName = GetExtensionName(bPreloadedEnitityBody, 0, bPreloadedEnitityBody.Length - 1);            FileStream fs;            DirectoryInfo diTempFileDir = new DirectoryInfo(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//"));            if (!diTempFileDir.Exists)            {//说明是对新文件的第一次读取,先创建临时文件夹和文件                Directory.CreateDirectory(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//"));            }            FileInfo fiFile = new FileInfo(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + filename + "." + ufiFileInfo.strExtensionName));            if (!fiFile.Exists)            {                fs = File.Create(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + filename + "." + ufiFileInfo.strExtensionName));            }            else            {                fs = new FileStream(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + filename + "." + ufiFileInfo.strExtensionName), FileMode.Open, FileAccess.Write);            }            //或取文件结束分隔符            iEndStart = GetIndexOfByte(bPreloadedEnitityBody, bboundary, ufiFileInfo.IFileStart, bPreloadedEnitityBody.Length - 1, 0);            //如果没有找到,说明文件还没有结束            if (iEndStart < 0)            {//本次请求只有部分文件数据                temp = new byte[bboundary.Length];                Array.Copy(bPreloadedEnitityBody, bPreloadedEnitityBody.Length - bboundary.Length, temp, 0, bboundary.Length);//预留一部分数组防止分界标志位于两个数据块中                fs.Write(bPreloadedEnitityBody, ufiFileInfo.IFileStart, bPreloadedEnitityBody.Length - bboundary.Length - ufiFileInfo.IFileStart);                bReadDataFinished = false;                bGoOnGetFileFromThisByte = false;//因为在本次数组中只读取了部分文件数据,所以说明本次数组已经完全读取完毕。            }            else            {//本次请求包含完整的文件数据                if (GetIndexOfByte(bPreloadedEnitityBody, bendboundary, iEndStart, bPreloadedEnitityBody.Length - 1, 0) > 0)//这里可以提高下查询性能,可以直接从最后几个字符查起                {//说明请求数据已经全步读取完毕                    bGoOnGetFileFromThisByte = false;                }                else                {                    bGoOnGetFileFromThisByte = true;                }            }            fs.Flush();            fs.Close();            fs.Dispose();            //保留一段临时数组(防止分割分隔符)            if (bGoOnGetFileFromThisByte)            {                temp = new byte[bPreloadedEnitityBody.Length - iEndStart];                Array.Copy(bPreloadedEnitityBody, iEndStart, temp, 0, bPreloadedEnitityBody.Length - iEndStart);                bPreloadedEnitityBody = UnionByte(temp, null);                temp = null;            }        }        else        {            int iEndStart = 0;            bPreloadedEnitityBody = UnionByte(bPreloadedEnitityBody, temp);            FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + filename + "." + ufiFileInfo.strExtensionName), FileMode.Append, FileAccess.Write);            iEndStart = GetIndexOfByte(bPreloadedEnitityBody, bboundary, ufiFileInfo.ICurrentIndex, bPreloadedEnitityBody.Length - 1, 0);            if (iEndStart < 0)            {//文件数据没有结束                temp = new byte[bboundary.Length];                Array.Copy(bPreloadedEnitityBody, bPreloadedEnitityBody.Length - bboundary.Length, temp, 0, bboundary.Length);//预留一部分数组防止分界标志位于两个数据块中                fs.Write(bPreloadedEnitityBody, 0, bPreloadedEnitityBody.Length - bboundary.Length);                bGoOnGetFileFromThisByte = false;            }            else            {                if (iEndStart > 0)                {                    if (GetIndexOfByte(bPreloadedEnitityBody, bendboundary, iEndStart, bPreloadedEnitityBody.Length - 1, 0) > 0)//这里可以提高下查询性能,可以直接从最后几个字符查起                    {//说明请求数据已经全部读取完毕                        bGoOnGetFileFromThisByte = false;                    }                    else                    {                        bGoOnGetFileFromThisByte = true;                    }                }                bReadDataFinished = true;            }            fs.Flush();            fs.Close();            fs.Dispose();            if (bGoOnGetFileFromThisByte)            {                temp = new byte[bPreloadedEnitityBody.Length - iEndStart];                Array.Copy(bPreloadedEnitityBody, iEndStart, temp, 0, bPreloadedEnitityBody.Length - iEndStart);                bPreloadedEnitityBody = UnionByte(temp, null);                temp = null;            }        }        byte[] bReadStepByte = new byte[iReadStepSize];        ufiFileInfo.dtStartFileRecv = DateTime.Now;        ufiFileInfo.iReadedBytes = iRead;        if (!request.IsEntireEntityBodyIsPreloaded())        {            while (iLeave > iReadStepSize && request.IsClientConnected())            {                iRead = request.ReadEntityBody(bReadStepByte, iReadStepSize);//之前不能去请求其它的数据                GetFile(bReadStepByte, ufiFileInfo);                ufiFileInfo.iReadedBytes += iRead;                iLeave -= iRead;            }            if (iLeave > 0 && request.IsClientConnected())            {                iRead = request.ReadEntityBody(bReadStepByte, iLeave);//最后还剩一部分,因为小于n,所以写在循环外                byte[] bLastByte = new byte[iRead];                for (int i = 0; i < iRead; i++)                {                    bLastByte[i] = bReadStepByte[i];                }                GetFile(bLastByte, ufiFileInfo);                ufiFileInfo.iReadedBytes += iRead;            }        }    }    #region 从数据块中获取文件内容    /// <summary>    /// 从数据块中获取文件内容    /// </summary>    /// <param name="bFileByte">数据块</param>    private void GetFile(byte[] bFileByte, UploadFileInfo ufiFileInfo)    {        bool bGoOnGetFileFromThisByte = true;//当一个新文件读取结束时为true。用以读取多个上传文件        while (bGoOnGetFileFromThisByte)        {            try            {                if (bFileByte.Length < 1) return;                if (bReadDataFinished)                {//对一个新文件的第一次读取                    if (temp != null)                    {                        bFileByte = UnionByte(bFileByte, temp);                    }                    #region 判断是否有文件数据头                    int iDataStart = 0, iDataStart2 = 0, iDataStart3 = 0, iEndStart = 0;                    iDataStart = GetIndexOfByte(bFileByte, eContentEncode.GetBytes("filename="), 0, bFileByte.Length - 1, 9);//获取"filename="后的位置                    if (iDataStart < 0)                    {                        temp = new byte[bendboundary.Length];                        Array.Copy(bFileByte, bFileByte.Length - temp.Length, temp, 0, temp.Length);//预留一部分数组防止"filename="位于两个数据块中                        return;                    }                    iDataStart2 = GetIndexOfByte(bFileByte, eContentEncode.GetBytes("\r\n"), iDataStart, bFileByte.Length - 1, 2);//获取\r\nContent-Type: text/plain这句话的起始坐标,这之后有两个换言之行符,所以下句偏移4                    if (iDataStart2 < 0)                    {                        temp = new byte[bFileByte.Length - iDataStart + 9];//大小应该为数据块的结束位置-filename的起始位置+1,这样方便获取文件名                        Array.Copy(bFileByte, bFileByte.Length - temp.Length, temp, 0, temp.Length);//预留一部分数组防止文件名位于两个数据块中                         return;                    }                    ufiFileInfo.strExtensionName = GetExtensionName(bFileByte, 0, bFileByte.Length - 1);                    iDataStart3 = GetIndexOfByte(bFileByte, eContentEncode.GetBytes("\r\n"), iDataStart2, bFileByte.Length - 1, 4);//获取文件开始处的位置                    if (iDataStart3 < 0)                    {                        temp = new byte[bFileByte.Length - iDataStart + 9];//大小应该为数据块的结束位置-filename的起始位置+1,这样方便获取文件名                        Array.Copy(bFileByte, bFileByte.Length - temp.Length, temp, 0, temp.Length);//预留一部分数组防止文件名后的"Content-Type....\r\n"位于两个数据块中                        return;                    }                    #endregion                    ufiFileInfo.IFileStart = iDataStart3;                    FileStream fs;                    try                    {                        DirectoryInfo diTempFileDir = new DirectoryInfo(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//"));                        if (!diTempFileDir.Exists)                        {//说明是对新文件的第一次读取,先创建临时文件夹和文件                            Directory.CreateDirectory(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//"));                        }                        FileInfo fiFile = new FileInfo(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + ufiFileInfo.StrFileName + "." + ufiFileInfo.strExtensionName));                        if (!fiFile.Exists)                        {                            fs = File.Create(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + ufiFileInfo.StrFileName + "." + ufiFileInfo.strExtensionName));                        }                        else                        {                            fs = new FileStream(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + ufiFileInfo.StrFileName + "." + ufiFileInfo.strExtensionName), FileMode.Open, FileAccess.Write);                        }                        iEndStart = GetIndexOfByte(bFileByte, bboundary, ufiFileInfo.IFileStart, bFileByte.Length - 1, 0);                        if (iEndStart < 0)                        {//本次请求只有部分文件数据                            temp = new byte[bboundary.Length];                            Array.Copy(bFileByte, bFileByte.Length - bboundary.Length, temp, 0, bboundary.Length);//预留一部分数组防止分界标志位于两个数据块中                            fs.Write(bFileByte, ufiFileInfo.IFileStart, bFileByte.Length - bboundary.Length - ufiFileInfo.IFileStart);                            bReadDataFinished = false;                            bGoOnGetFileFromThisByte = false;//因为在本次数组中只读取了部分文件数据,所以说明本次数组已经完全读取完毕。                        }                        else                        {//本次请求包含完整的文件数据                            if (GetIndexOfByte(bFileByte, bendboundary, iEndStart, bFileByte.Length - 1, 0) > 0)//这里可以提高下查询性能,可以直接从最后几个字符查起                            {//说明请求数据已经全步读取完毕                                // WriteHttpRequestWithoutFileData(bFileByte, iEndStart, bFileByte.Length - iEndStart, ref brequest);                                bGoOnGetFileFromThisByte = false;                            }                            else                            {                                bGoOnGetFileFromThisByte = true;                            }                        }                        fs.Flush();                        fs.Close();                        fs.Dispose();                    }                    catch                    {                        ufiFileInfo.Status = UploadStatus.Error;                        return;//*****上传失败*****                    }                    if (bGoOnGetFileFromThisByte)                    {                        temp = new byte[bFileByte.Length - iEndStart];                        Array.Copy(bFileByte, iEndStart, temp, 0, bFileByte.Length - iEndStart);                        bFileByte = UnionByte(temp, null);                        temp = null;                    }                }                else                {                    int iEndStart = 0;                    bFileByte = UnionByte(bFileByte, temp);                    try                    {                        FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("TempUpload/" + ufiFileInfo.strFileGuid + "//" + ufiFileInfo.StrFileName + "." + ufiFileInfo.strExtensionName), FileMode.Append, FileAccess.Write);                        iEndStart = GetIndexOfByte(bFileByte, bboundary, ufiFileInfo.ICurrentIndex, bFileByte.Length - 1, 0);                        if (iEndStart < 0)                        {//文件数据没有结束                            temp = new byte[bboundary.Length];                            Array.Copy(bFileByte, bFileByte.Length - bboundary.Length, temp, 0, bboundary.Length);//预留一部分数组防止分界标志位于两个数据块中                            fs.Write(bFileByte, 0, bFileByte.Length - bboundary.Length);                            bGoOnGetFileFromThisByte = false;                        }                        else                        {                            if (iEndStart > 0)                            {                                if (GetIndexOfByte(bFileByte, bendboundary, iEndStart, bFileByte.Length - 1, 0) > 0)//这里可以提高下查询性能,可以直接从最后几个字符查起                                {//说明请求数据已经全部读取完毕                                    bGoOnGetFileFromThisByte = false;                                }                                else                                {                                    bGoOnGetFileFromThisByte = true;                                }                            }                            bReadDataFinished = true;                        }                        fs.Flush();                        fs.Close();                        fs.Dispose();                    }                    catch                    {                        ufiFileInfo.Status = UploadStatus.Error;                        return;//*****上传失败*****                    }                    if (bGoOnGetFileFromThisByte)                    {                        temp = new byte[bFileByte.Length - iEndStart];                        Array.Copy(bFileByte, iEndStart, temp, 0, bFileByte.Length - iEndStart);                        bFileByte = UnionByte(temp, null);                        temp = null;                    }                }            }            catch            {                ufiFileInfo.Status = UploadStatus.Error;                return;//*****上传失败*****            }        }    }    #endregion    #region 获取上传标识ID    private string GetUploadId(byte[] array, Encoding eEncode)    {        byte[] b1 = eEncode.GetBytes("Content-Disposition: form-data; name=\"EUploadID\"");        int iStartIndex = GetIndexOfByte(array, b1, 0, array.Length - 1, 0);        if (iStartIndex < 0)            return string.Empty;        else        {            iStartIndex = GetIndexOfByte(array, eEncode.GetBytes("\r\n\r\n"), iStartIndex, array.Length - 1, 4);            if (iStartIndex < 0)                return string.Empty;            else            {                int iEndIndex = GetIndexOfByte(array, eEncode.GetBytes("\r\n"), iStartIndex, array.Length - 1, 0);                if (iEndIndex < 0) return string.Empty;                else                    return eEncode.GetString(array, iStartIndex, iEndIndex - iStartIndex);            }        }    }    #endregion    #region 从数据块中读取文件扩展名    /// <summary>    /// 从数据块中读取文件扩展名    /// </summary>    /// <param name="array">数据块</param>    /// <param name="istartindex">检索的起始位置</param>    /// <param name="iendindex">检索的结束位置</param>    /// <returns></returns>    private string GetExtensionName(byte[] array, int istartindex, int iendindex)    {        byte[] b1 = eContentEncode.GetBytes("filename=");        string strExtensionName;        int iFileNameStartIndex = GetIndexOfByte(array, b1, istartindex, iendindex, b1.Length);//获取文件名的起始位置        if (iFileNameStartIndex < 0)        {//注:可能该字段刚好处于两个数据块中            return string.Empty;        }        b1 = eContentEncode.GetBytes("\r\n");//"\r\n"占两个字节        int iFileNameEndIndex = GetIndexOfByte(array, b1, iFileNameStartIndex, iendindex, 0) - 2;//获取文件名结尾的位置        if (iFileNameEndIndex > iFileNameStartIndex)        {//文件名格式是否正确直接在页面上处理,所以认为这里面的文件名合法            strExtensionName = eContentEncode.GetString(array, iFileNameStartIndex + 1, iFileNameEndIndex - iFileNameStartIndex);//获取文件全名,包括了路径        }        else        {            return string.Empty;        }        return strExtensionName.Substring(strExtensionName.LastIndexOf(".") + 1);    }    #endregion    #region 获取小数组在大数组中的位置    /// <summary>    /// 获取小数组在大数组中的位置    /// </summary>    /// <param name="b1">大数组</param>    /// <param name="b2">小数组</param>    /// <param name="iStartIndex">在大数组中检索的起始位置</param>    /// <param name="iEndIndex">可在大数组中检索的最大的位置</param>    /// <param name="iOffset">偏移量</param>    /// <returns>检索到的位置和偏移量的和</returns>    private int GetIndexOfByte(byte[] b1, byte[] b2, int iStartIndex, int iEndIndex, int iOffset)    {        int i = -1;//用来表示是否出错        if (iStartIndex < 0 || iEndIndex < 0 || iStartIndex > iEndIndex) return -1;        if (b2.Length == 1)        {//如果小数组的长度就是1那表明查询一次就可以找到,不需要while            return Array.IndexOf(b1, b2[0], iStartIndex);        }        while (iStartIndex <= iEndIndex)        {//"="的情况是在b1只有一个字节的时候发生            iStartIndex = Array.IndexOf(b1, b2[0], iStartIndex);//从b1中的iStartIndex位置处开始检索b2[0],没检索到则返回-1;            if (iStartIndex < 0)            {                return -1;            }            for (int index = 1; index < b2.Length; index++)            {//对剩余的字节进行逐个匹配                if (iStartIndex + index > iEndIndex)                {//如果索引的起点+预检索字符的长度>大数组的最大下标,则没有找到。                    return -1;                }                if (b1[iStartIndex + index] != b2[index])                {                    i = -1;                    iStartIndex++;                    break;                }            }            if (i >= 0)            {//如果i>=0则说明找到完全匹配的                i = iStartIndex;                i += iOffset;                break;            }            else            {                i = 0;            }        }        return i;    }    #endregion    #region 获取分隔符的字符数组    /// <summary>    /// 获取分隔符的字符数组    /// </summary>    /// <param name="ContentType">请求类型</param>    /// <returns>分隔符字节数组</returns>    private byte[] GetMultipartBoundary(string ContentType)    {        int nPos = ContentType.IndexOf("boundary=");        string sTemp = ContentType.Substring(nPos + 9);        string sBoundary = sTemp = "--" + sTemp;        return Encoding.ASCII.GetBytes(("\r\n" + sTemp).ToCharArray());    }    /// <summary>    /// 获取结束分隔符的字符数组    /// </summary>    /// <param name="ContentType">请求类型</param>    /// <returns>分隔符字节数组</returns>    private byte[] GetEndBoundary(string ContentType)    {        int nPos = ContentType.IndexOf("boundary=");        string sTemp = ContentType.Substring(nPos + 9);        string sBoundary = sTemp = "--" + sTemp + "--";        return Encoding.ASCII.GetBytes(("\r\n" + sTemp).ToCharArray());    }    #endregion    #region 拼合两个数组    private byte[] UnionByte(byte[] bnewbyte, byte[] boldbyte)    {        int iLen = 0;        if (bnewbyte != null)        {//要添加到原数组中的字节如果不为空            if (boldbyte != null)            {                iLen = boldbyte.Length;            }            byte[] unionbyte = new byte[bnewbyte.Length + iLen];            if (boldbyte != null)            {                boldbyte.CopyTo(unionbyte, 0);            }            bnewbyte.CopyTo(unionbyte, iLen);            return unionbyte;        }        else        {            return boldbyte;        }    }    #endregion    public void Dispose()    {    }    public upLoad()    {        //        //TODO: 在此处添加构造函数逻辑        //    }}

三,UploadFileInfo类是为了储存进度数据:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;/// <summary>///UploadFileInfo 的摘要说明/// </summary>public class UploadFileInfo{       /// <summary>    /// 已经上传的字节数    /// </summary>    public int iReadedBytes = 0;    /// <summary>    /// 需传的字节总数    /// </summary>    public int iTotalBytes = 0;    public double iTotalSeconds = 0;    /// <summary>    /// 文件开始接收的时间    /// </summary>    public DateTime dtStartFileRecv;    private string strFullName;    /// <summary>    /// 文件名:包含文件的完整路径    /// </summary>    public string StrFullName    {        get        {            return strFullName;        }        set        {            strFullName = value;        }    }    private string strFileName;    /// <summary>    /// 文件名    /// </summary>    public string StrFileName    {        get        {            return strFileName;        }        set        {            strFileName = value;        }    }    private int iFileStart;    /// <summary>    /// 文件数据部分的起始索引    /// </summary>    public int IFileStart    {        get        {            return iFileStart;        }        set        {            iFileStart = value;        }    }    /// <summary>    /// 文件扩展名    /// </summary>    public string strExtensionName;    private int iCurrentIndex;    public int ICurrentIndex    {        get        {            return iCurrentIndex;        }        set        {            iCurrentIndex = value;        }    }    /// <summary>    /// 返回上传速度,单位K/S    /// </summary>    public double fSpeed    {        get        {            if (iReadedBytes <= 0)            {                return 0;            }            TimeSpan ts = DateTime.Now - dtStartFileRecv;            if (ts.TotalSeconds > 0)            {                this.iTotalSeconds = ts.TotalSeconds;                return double.Parse((iReadedBytes / 1024 / ts.TotalSeconds).ToString("0.0"));            }            else            {                return 0;            }        }    }    /// <summary>    /// 读取文件上传的进度    /// </summary>    public int iPercent    {        get        {            if (iTotalBytes > 0)                return Convert.ToInt32(Math.Floor((iReadedBytes / (double)iTotalBytes) * 100));            else                return 0;        }    }    private string str_FileGuid = string.Empty;    /// <summary>    /// 文件的唯一标识    /// </summary>    public string strFileGuid    {        get        {            return str_FileGuid;        }        set        {            str_FileGuid = value;        }    }    public bool bHasErrorInfo = false;    /// <summary>    /// 上传的状态    /// </summary>    public UploadStatus Status = UploadStatus.Initializing;    private string str_TempDir;    /// <summary>    /// 文件的临时路径    /// </summary>    public string strTempDir    {        get        {            return str_TempDir;        }        set        {            str_TempDir = value;        }    }    public UploadFileInfo()    {        //        // TODO: 在此处添加构造函数逻辑        //    }    public UploadFileInfo(string sFileName)    {        strFileName = sFileName;    }    public void SaveAs(string strSavePath)    {        if (!strSavePath.EndsWith("\\"))        {            strSavePath = strSavePath + "\\";        }        DirectoryInfo di = new DirectoryInfo(strTempDir);        if (di.Exists)        {            try            {                Directory.CreateDirectory(strSavePath);                foreach (FileInfo fi in di.GetFiles())                {                    fi.MoveTo(strSavePath + fi.Name);                }                Status = UploadStatus.Finish;            }            catch            {                Status = UploadStatus.Error;            }        }        else        {            Status = UploadStatus.Error;        }    }}/// <summary>/// 上传的状态/// </summary>public enum UploadStatus{    /// <summary>    /// 上传过程中出现错误    /// </summary>    Error,    /// <summary>    /// 正在初始化    /// </summary>    Initializing,    /// <summary>    /// 正在上传    /// </summary>    Uploading,    /// <summary>    /// 文件已经成功上传    /// </summary>    Finish,    /// <summary>    /// 上传过程被用户取消    /// </summary>    CanceledByUser}
View Code

四,EXTJS就是它需要用到的一些文件。版本是extjs4.2

五,TempUpload文件上传文件夹。

六,Progress.aspx与Progress.cs

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Progress.aspx.cs" Inherits="Progress" %><!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 type="text/javascript">        function myRefresh(url) {                        setTimeout(location.replace(url), 1000);                             }           </script></head><body>    <form id="form1" runat="server">    <div>         </div>    </form></body></html>
View Code
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Text;public partial class Progress : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        UploadFileInfo ufi = null;        ufi = (UploadFileInfo)HttpContext.Current.Cache[Request["UploadID"]];        string stratevent = Request.QueryString["event"];        if (!IsPostBack)        {            if (stratevent == null)            {                if (ufi == null)                {                    return;                }                else                {                    StringBuilder script = new StringBuilder();                    script.Append("<script>myRefresh(‘Progress.aspx?UploadID=" + ufi.strFileGuid + "&event=start‘);</script>");                    ClientScript.RegisterClientScriptBlock(this.GetType(), "js", script.ToString());                }            }        }        if (stratevent != null)        {            if (stratevent.ToLower() == "start" && ufi != null)            {                Response.Write(ufi.iPercent);                Response.Flush();                Response.Close();                if (ufi.iPercent == 100)                {                    ufi.iReadedBytes = 0;                }            }        }    }}
View Code

七,upfileload.aspx与upfileload.cs

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="upfileload.aspx.cs" Inherits="upfileload" %><%if (Request.Params["upload"] != "true")  { %><!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 id="Head1" runat="server">    <title></title>    <link href=http://www.mamicode.com/"extjs/resources/css/ext-all.css" rel="stylesheet" type="text/css" />    <script src=http://www.mamicode.com/"extjs/ext-all-debug.js" type="text/javascript"></script>    <script src=http://www.mamicode.com/"extjs/locale/ext-lang-zh_CN.js" type="text/javascript"></script>    <script type="text/javascript">        Ext.onReady(function () {            Ext.QuickTips.init();            //            var msg = function (title, msg) {            //                Ext.Msg.show({            //                    title: title,            //                    msg: msg,            //                    minWidth: 200,            //                    model: true            //                });            //            }            var fp = Ext.create(Ext.form.Panel, {                renderTo: document.getElementById("form1"),                width: 500,                frame: true,                title: 图片上传,                autoHeight: true,                bodyStyle: padding: 10px 10px 0 10px;,                labelWidth: 50,                defaults: {                    anchor: 95%,                    allowBlank: false,                    msgTarget: side                },                items: [{                    xtype: hiddenfield,                    name: EUploadID,                    id: EUploadID,                    value: document.getElementById("UploadID").value                },                                {                                    xtype: textfield,                                    name: txtname,                                    id: txtname,                                    fieldLabel: Name                                },                 {                     xtype: filefield,                     id: form-file,                     emptyText: Select an image,                     fieldLabel: Photo,                     name: photo-path,                     buttonText: 浏览                 }, {                     xtype: progressbar,                     id: pgb                 }],                buttons: [{                    text: Save,                    handler: function () {                        if (fp.getForm().isValid()) {                            fp.getForm().submit({                                type: POST,                                url: upfileload.aspx?action=upload&upload=true,                                success: function (fp, o) {                                }                            });                            ;                            var f = function (v) {                                var i = v / 100;                                Ext.getCmp("pgb").updateProgress(i, 进度: + v + /100);                                if (v == 100) {                                    Ext.getCmp("pgb").reset();   //复位进度条                                    Ext.getCmp("pgb").updateText(完成);                                }                            }                            var xmlhttp;                            function loadXMLDoc(url) {                                xmlhttp = null;                                if (window.XMLHttpRequest) {// code for IE7, Firefox, Opera, etc.                                    xmlhttp = new XMLHttpRequest();                                }                                else if (window.ActiveXObject) {// code for IE6, IE5                                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");                                }                                if (xmlhttp != null) {                                    xmlhttp.open("GET", url, true);                                    xmlhttp.onreadystatechange = function () {                                        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {                                            var temp = xmlhttp.responseText;                                            f(temp);                                            if (temp != 100) {                                                loadXMLDoc("Progress.aspx?event=start&UploadID=" + document.getElementById("UploadID").value);                                            }                                            temp = 0;                                        }                                    }                                    xmlhttp.send(null);                                }                                else {                                    alert("Your browser does not support XMLHTTP.");                                }                            }                            loadXMLDoc("Progress.aspx?event=start&UploadID=" + document.getElementById("UploadID").value);                        }                    }                }, {                    text: Reset,                    handler: function () {                        fp.getForm().reset();                    }                }]            });        });          </script></head><body>    <form id="form1" runat="server">    </form>    <div id="progress" style="display: none" runat="server">    </div></body></html><%} %>
View Code
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;public partial class upfileload : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        if (!IsPostBack)        {            UploadFileInfo ufi = new UploadFileInfo();            ufi.strFileGuid = Guid.NewGuid().ToString();//还是换成guid比较好,因为有可能会产生同一时刻上传的动作            //ScriptManager.RegisterHiddenField();            ClientScript.RegisterHiddenField("UploadID", ufi.strFileGuid);            HttpContext.Current.Cache.Add(ufi.strFileGuid, ufi, null, DateTime.Now.AddDays(10), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.High, null);            progress.InnerHtml = "<iframe src=http://www.mamicode.com/‘Progress.aspx?UploadID=" + ufi.strFileGuid + "‘ width=‘100%‘  scrolling=no frameborder=‘0‘></iframe>";        }    }}
View Code

八,web.config

<?xml version="1.0"?><!--  有关如何配置 ASP.NET 应用程序的详细信息,请访问  http://go.microsoft.com/fwlink/?LinkId=169433  --><configuration>  <system.web>    <httpModules>      <add name="MyUpLoad" type="upLoad"/>    </httpModules>    <httpRuntime maxRequestLength="8192" executionTimeout="300000"/>    <compilation debug="true" targetFramework="4.0"/>  </system.web></configuration>
View Code

 

EXTJS+ASP.NET上传文件带实时进度条代码