Wednesday, June 16, 2010

06/16 : Using Httphanlder to download different files

 

(1)Create a page with a link with download file path to another page download.aspx.

eg:

string url = (@"\\colpdm20\TIEMLCL Vaults\Released\00110-U1170-71-B.tif"); 
link.NavigateUrl = "~/download.aspx?fn=" + url;

(2). Create a empty download.aspx page

(3). Create Httphandler to handle downloading request

public class DownloadHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        HttpResponse Response = context.Response;
        HttpRequest Request = context.Request;

        System.IO.Stream iStream = null;

        byte[] buffer = new Byte[10240];

        int length;

        long dataToRead;

        try
        {
            string filename = Request["fn"];
                //"52110-32960-71_843789_822.JPG";
                //FileHelper.Decrypt(Request["fn"]); //通过解密得到文件名

            string filepath = Request["fn"];
//@"\\colpdm20\TIEMLCL Vaults\Released\" + filename;
                //HttpContext.Current.Server.MapPath("~/") + "files/" + filename; //待下载的文件路径

            iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                System.IO.FileAccess.Read, System.IO.FileShare.Read);
            Response.Clear();

            dataToRead = iStream.Length;

            long p = 0;
            if (Request.Headers["Range"] != null)
            {
                Response.StatusCode = 206;
                p = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
            }
            if (p != 0)
            {
                Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
            }
            Response.AddHeader("Content-Length", ((long)(dataToRead - p)).ToString());
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(Path.GetFileName(filename))));

            iStream.Position = p;
            dataToRead = dataToRead - p;

            while (dataToRead > 0)
            {
                if (Response.IsClientConnected)
                {
                    length = iStream.Read(buffer, 0, 10240);

                    Response.OutputStream.Write(buffer, 0, length);
                    Response.Flush();

                    buffer = new Byte[10240];
                    dataToRead = dataToRead - length;
                }
                else
                {
                    dataToRead = -1;
                }
            }
        }
        catch (Exception ex)
        {
            Response.Write("Error : " + ex.Message);
        }
        finally
        {
            if (iStream != null)
            {
                iStream.Close();
            }
            Response.End();
        }
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

 

(4). Add following changes in web.config

<httpHandlers>
            <add verb="*" path="download.aspx" type="DownloadHandler"/>
….

</httpHandlers>

0 Comments:

Post a Comment

<< Home