Neil Neil - 1 month ago 12
ASP.NET (C#) Question

Download excel file from page via WebApi call

I'm trying to send a 9MB

.xls
file as a response from web api controller method. The user will click a button on the page and this will trigger the download via the browser.

Here's what I've got so far but it doesn't work however it doesn't throw any exceptions either.

[AcceptVerbs("GET")]
public HttpResponseMessage ExportXls()
{
try
{
byte[] excelData = m_toolsService.ExportToExcelFile();

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new MemoryStream(excelData);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "Data.xls"
};
return result;
}
catch (Exception ex)
{
m_logger.ErrorException("Exception exporting as excel file: ", ex);
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}


Here is the coffeescript/javascript jquery ajax call from a button click in the interface.

$.ajax(
url: route
dataType: 'json'
type: 'GET'
success: successCallback
error: errorCallback
)


Now that I think about it perhaps the dataType is wrong and shouldn't be json...

Answer

I had to make a couple of small changes to get this to work

First: Change the method to a post

[AcceptVerbs("POST")]

Second: Change from using the jQuery ajax lib to use a hidden form, here's my service function for doing the hidden form and submitting it.

exportExcel: (successCallback) =>
    if $('#hidden-excel-form').length < 1
        $('<form>').attr(
            method: 'POST',
            id: 'hidden-excel-form',
            action: 'api/tools/exportXls'
        ).appendTo('body');

    $('#hidden-excel-form').bind("submit", successCallback)
    $('#hidden-excel-form').submit()

Hopefully there's a better way to do this but for the time being it's working and downloading the excel file nicely.

Comments