adding header to http response in an action inside a controller in asp.net/mvc
asp.net-mvc, c#, httpcontext, response
Solution
Yes, You are doing it the wrong way try this, you should add the header inside your action not as an attribute header to your method.
HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)
or
Request.RequestContext.HttpContext.Response.AddHeader("Content-Disposition", "Attachment;filename=" & name)
Update As i understand you are making an ajax call to your controller/action which wont work for file download by directly calling an action. You can achieve it this way.
public void Download(string name)
{
//your logic. Sample code follows. You need to write your stream to the response.
var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf");
var stream = new MemoryStream(filestream);
stream.WriteTo(Response.OutputStream);
Response.AddHeader("Content-Disposition", "Attachment;filename=targetFileName.pdf");
Response.ContentType = "application/pdf";
}
or
public FileStreamResult Download(string name)
{
var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf");
var stream = new MemoryStream(filestream);
return new FileStreamResult(stream, "application/pdf")
{
FileDownloadName = "targetfilename.pdf"
};
}
In your JS button click you can just do something similar to this.
$('#btnDownload').click(function () {
window.location.href = "controller/download?name=yourargument";
});
Problem
I am streaming data from server to client for download using `filestream.write`. In that case what is happening is that I am able to download the file but it does not appear as download in my browser. Neither the pop-up for "Save As" appears not "Download Bar" appears in Downloads section. From looking around, I guess I need to include "something" in the response header to tell the browser that there is an attachment with this response. Also I want to set the cookie. To accomplish this, this is what I am doing: ``` [HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)] public ActionResult Download(string name) { // some more code to get data in inputstream. using (FileStream fs = System.IO.File.OpenWrite(TargetFile)) { byte[] buffer = new byte[SegmentSize]; int bytesRead; while ((bytesRead = inputStream.Read(buffer, 0, SegmentSize)) > 0) { fs.WriteAsync(buffer, 0, bytesRead); } } } return RedirectToAction("Index"); } ``` I am getting error that: "System.web.httpcontext.current is a property and is used as a type." Am I doing the header updating at the right place? Is there any other way to do this?