receive net files c# asp.net excel asp.net-web-api xls

net - upload files rest api c#



Descargar el archivo de Excel desde la página a través de la llamada WebApi (4)

Esto devolverá un archivo al hacer clic en un botón en particular

public FileResult ExportXls(){ //the byte stream is the file you want to return return File(bytes, "application/msexcel") }

Estoy tratando de enviar un archivo .xls 9MB como una respuesta del método del controlador web api. El usuario hará clic en un botón en la página y esto activará la descarga a través del navegador.

Esto es lo que tengo hasta ahora, pero no funciona, pero tampoco arroja excepciones.

[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); } }

Aquí está el coffeescript / javascript jquery ajax call desde un botón, haga clic en la interfaz.

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

Ahora que lo pienso, quizás el tipo de datos es incorrecto y no debería ser json ...


Experimenté el mismo problema. Problema resuelto con lo siguiente:

window.open(url)


Funciona también como un método HTTP GET, pero no usa $ ajax, en su lugar usa window.open (url);

Código C #:

[HttpGet] [Route("report/{scheduleId:int}")] public HttpResponseMessage DownloadReport(int scheduleId) { var reportStream = GenerateExcelReport(scheduleId); var result = Request.CreateResponse(HttpStatusCode.OK); result.Content = new StreamContent(reportStream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Schedule Report.xlsx" }; return result; }

Código JS:

downloadScheduleReport: function (scheduleId) { var url = baseUrl + ''api/Tracker/report/'' + scheduleId; window.open(url); }


Tuve que hacer un par de pequeños cambios para que esto funcione.

Primero: Cambia el método a una publicación.

[AcceptVerbs("POST")]

Segundo: Cambie de usar jQuery ajax lib para usar un formulario oculto, aquí está mi función de servicio para hacer el formulario oculto y enviarlo.

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()

Esperemos que haya una mejor manera de hacer esto, pero por el momento está funcionando y descargando el archivo excel muy bien.