Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download/Stream file from URL - asp.net

I need to stream a file which will result in save as prompt in the browser. The issue is, the directory that the file is located is virtually mapped, so I am unable to use Server.MapPath to determine it's actual location. The directory is not in the same location (or even phyical server on the live boxes) as the website.

I'd like something like the following, but that will allow me to pass a web URL, and not a server file path.

I may have to end up building my file path from a config base path, and then append on the rest of the path, but hopefully I can do it this way instead.

var filePath = Server.MapPath(DOCUMENT_PATH);  if (!File.Exists(filePath))     return;  var fileInfo = new System.IO.FileInfo(filePath); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", filePath)); Response.AddHeader("Content-Length", fileInfo.Length.ToString()); Response.WriteFile(filePath); Response.End(); 
like image 969
mp3duck Avatar asked Apr 08 '11 14:04

mp3duck


People also ask

What is FileStreamResult?

FileContentResult. Represents an ActionResult that when executed will write a binary file to the response. FileStreamResult. Represents an ActionResult that when executed will write a file from a stream to the response.


1 Answers

You could use HttpWebRequest to get the file and stream it back to the client. This allows you to get the file with a url. An example of this that I found ( but can't remember where to give credit ) is

    //Create a stream for the file     Stream stream = null;      //This controls how many bytes to read at a time and send to the client     int bytesToRead = 10000;      // Buffer to read bytes in chunk size specified above     byte[] buffer = new Byte[bytesToRead];      // The number of bytes read     try     {       //Create a WebRequest to get the file       HttpWebRequest fileReq = (HttpWebRequest) HttpWebRequest.Create(url);        //Create a response for this request       HttpWebResponse fileResp = (HttpWebResponse) fileReq.GetResponse();        if (fileReq.ContentLength > 0)         fileResp.ContentLength = fileReq.ContentLength;          //Get the Stream returned from the response         stream = fileResp.GetResponseStream();          // prepare the response to the client. resp is the client Response         var resp = HttpContext.Current.Response;          //Indicate the type of data being sent         resp.ContentType = MediaTypeNames.Application.Octet;              //Name the file          resp.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");         resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());              int length;         do         {             // Verify that the client is connected.             if (resp.IsClientConnected)             {                 // Read data into the buffer.                 length = stream.Read(buffer, 0, bytesToRead);                  // and write it out to the response's output stream                 resp.OutputStream.Write(buffer, 0, length);                  // Flush the data                 resp.Flush();                  //Clear the buffer                 buffer = new Byte[bytesToRead];             }             else             {                 // cancel the download if client has disconnected                 length = -1;             }         } while (length > 0); //Repeat until no data is read     }     finally     {         if (stream != null)         {             //Close the input stream             stream.Close();         }     } 
like image 114
Dallas Avatar answered Sep 22 '22 22:09

Dallas