9

Using regular Controller I could do it by returning FileResult. The same doesn't seem to work with ApiController. Can it be done? Is it even a right thing to do?

Bart
  • 19,692
  • 7
  • 68
  • 77
Joe Shmo
  • 303
  • 5
  • 9

2 Answers2

6

Try this.

[HttpGet]    
public HttpResponseMessage Get()
    {
        var file = HttpContext.Current.Server.MapPath("~/Images/accent.png");
        var stream = new FileStream(file, FileMode.Open);
        var content = new HttpResponseMessage(HttpStatusCode.OK)
                         {
                             Content = new StreamContent(stream)
                         };
        content.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        return content;
    }
Md Nazmoon Noor
  • 3,187
  • 1
  • 24
  • 30
4

I have this working thanks to this question.

using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web.Http;

namespace Web.Controllers
{
    //usage: /download/report

    [RoutePrefix("download")]
    public class DownloadController : ApiController
    {
        [HttpGet("report")]
        public HttpResponseMessage Report()
        {
            using (var service = new Client())
            {
                var report = service.BuildReport();

                return DownloadResponse(report, "Report.csv");
            }
        }

        private static HttpResponseMessage DownloadResponse(string content, string fileName)
        {
            var downloadContent = new StringContent(content);

            var mediaType = new MediaTypeHeaderValue("application/octet-stream");
            var disposition= new ContentDispositionHeaderValue("attachment") { FileName = fileName };

            downloadContent.Headers.ContentType = mediaType;
            downloadContent.Headers.ContentDisposition = disposition;

            var result = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = downloadContent
            };

            return result;
        }
    }
}
Community
  • 1
  • 1
Matt Canty
  • 2,395
  • 5
  • 35
  • 50