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.