How to return a file (FileContentResult) in ASP.NET WebAPI How to return a file (FileContentResult) in ASP.NET WebAPI asp.net asp.net

How to return a file (FileContentResult) in ASP.NET WebAPI


Instead of returning StreamContent as the Content, I can make it work with ByteArrayContent.

[HttpGet]public HttpResponseMessage Generate(){    var stream = new MemoryStream();    // processing the stream.    var result = new HttpResponseMessage(HttpStatusCode.OK)    {        Content = new ByteArrayContent(stream.ToArray())    };    result.Content.Headers.ContentDisposition =        new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")    {        FileName = "CertificationCard.pdf"    };    result.Content.Headers.ContentType =        new MediaTypeHeaderValue("application/octet-stream");    return result;}


If you want to return IHttpActionResult you can do it like this:

[HttpGet]public IHttpActionResult Test(){    var stream = new MemoryStream();    var result = new HttpResponseMessage(HttpStatusCode.OK)    {        Content = new ByteArrayContent(stream.GetBuffer())    };    result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")    {        FileName = "test.pdf"    };    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");    var response = ResponseMessage(result);    return response;}


This question helped me.

So, try this:

Controller code:

[HttpGet]public HttpResponseMessage Test(){    var path = System.Web.HttpContext.Current.Server.MapPath("~/Content/test.docx");;    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);    var stream = new FileStream(path, FileMode.Open);    result.Content = new StreamContent(stream);    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");    result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(path);    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");    result.Content.Headers.ContentLength = stream.Length;    return result;          }

View Html markup (with click event and simple url):

<script type="text/javascript">    $(document).ready(function () {        $("#btn").click(function () {            // httproute = "" - using this to construct proper web api links.            window.location.href = "@Url.Action("GetFile", "Data", new { httproute = "" })";        });    });</script><button id="btn">    Button text</button><a href=" @Url.Action("GetFile", "Data", new { httproute = "" }) ">Data</a>