Make a file open in browser instead of downloading it
I have an MVC project that will display some documents to users. The files are currently stored in Azure blob storage.
Currently, the documents are retrieved from the following controller action:
[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")]
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
// get byte array from blob storage
byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
string mimeType = "application/octet-stream";
return File(doc, mimeType, fileName);
}
Right now, when a user clicks on a link like the following:
<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf
Then, the file downloads to their browser's downloads folder. What I would like to happen (and I thought was default behavior) is for the file to simply be displayed in the browser.
I have tried changing the mimetype and changing the return type to FileResult instead of ActionResult, both to no avail.
How can I make the file display in the browser instead of downloading?
Solution 1:
Thanks to all the answers, the solution was a combination of all of them.
First, because I was using a byte[]
the controller action needed to be FileContentResult
not just FileResult
. Found this thanks to: What's the difference between the four File Results in ASP.NET MVC
Second, the mime type needed to NOT be a octet-stream
. Supposedly, using the stream causes the browser to just download the file. I had to change the type application/pdf
. I will need to explore a more robust solution to handle other file/mime types though.
Third, I had to add a header that changed the content-disposition
to inline
. Using this post I figured out I had to modify my code to prevent duplicate headers, since the content-disposition was already being set to attachment
.
The successful code:
public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
string mimeType = "application/pdf"
Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName);
return File(doc, mimeType);
}
Solution 2:
It looks like someone else asked a similar question a while ago:
how to force pdf files to open in a browser
With an answer saying that you should use the header:
Content-Disposition: inline; filename.pdf
Solution 3:
Browsers should decide on downloading or displaying based on mime-type.
Try this:
string mimeType = "application/pdf";