Arifur Rahman
Arifur Rahman

Reputation: 54

Response.OutputStream.Write() Show data to browser Instead of Download

I use IHttpHandler to Download a file from Server.Everything works fine. But it shows the data on browser instead of download it. I need to download the file from the server like we do download from other servers.

Could anyone suggest me, what should I do to download the file, Or what is the convenient way to download a file(pdf,mp4 etc).

public void ProcessRequest(HttpContext context)
    {

        string strPathName = "";
        if (context.Request.QueryString["fileName"] != null)
        {
            strPathName = context.Request.QueryString["fileName"].ToString();
        }
        string filename = context.Server.MapPath("~/MyPath/" + strPathName);

        System.IO.Stream oStream = null;

        oStream =
            new System.IO.FileStream
                (path: filename,
                mode: System.IO.FileMode.Open,
                share: System.IO.FileShare.Read,
                access: System.IO.FileAccess.Read);
        try
        {
            context.Response.ClearHeaders();

            context.Response.Buffer = false;

            context.Response.ContentType = "application/octet-stream";


            context.Response.AddHeader("Content-Disposition", "attachment");

            long lngFileLength = oStream.Length;

            context.Response.AddHeader("Content-Length", lngFileLength.ToString());

            long lngDataToRead = lngFileLength;

            while (lngDataToRead > 0)
            {

                if (context.Response.IsClientConnected)
                {

                    int intBufferSize = 8 * 1024;

                    byte[] bytBuffers =
                        new System.Byte[intBufferSize];

                    int intTheBytesThatReallyHasBeenReadFromTheStream =
                        oStream.Read(buffer: bytBuffers, offset: 0, count: intBufferSize);

                    context.Response.OutputStream.Write
                        (buffer: bytBuffers, offset: 0,
                        count: intTheBytesThatReallyHasBeenReadFromTheStream);

                    context.Response.Flush();

                    lngDataToRead =
                        lngDataToRead - intTheBytesThatReallyHasBeenReadFromTheStream;
                }
                else
                {
                    lngDataToRead = -1;
                }
            }
        }
        catch { }
        finally
        {
            if (oStream != null)
            {
                oStream.Close();
                oStream.Dispose();
                oStream = null;
            }
           context.Response.Close();
        }
    }

Upvotes: 0

Views: 1760

Answers (1)

ADyson
ADyson

Reputation: 61904

You can't directly download a file via ajax, it only returns the data into a JS variable in the page's code, instead of triggering a traditional request and download.

Your button needs to make a standard HTTP request, not an ajax call.

Upvotes: 1

Related Questions