Usuario
Bajar Archivo ASP.Net / ASMX / Jquery Ajax

Pregunta
-
Hola Amigos,
1.- Creo un reporte en excel con excelpackage - epplus y retorno un arreglo de bytes
2.- Desde El ASMX(Es Mi vinculo entre mis javascript y asp.net) hago lo siguiente
listaDocumentos = (List<DocumentosEO>)System.Web.HttpContext.Current.Session["ConsultaDocumentos"]; paramsExc = new ExcelParamsEO(); paramsExc.Autor = HelperITO.ExcelAut; paramsExc.TituloExcel = HelperITO.ExcelRep; paramsExc.NombreArchivo = HelperITO.ExcelArc + DateTime.Now.ToString("ddMMMyyyy") + ".xlsx"; paramsExc.NombreHoja = HelperITO.ExcelHoj + DateTime.Now.ToString("ddMMMyyyy"); paramsExc.NombreReporte = HelperITO.ExcelRep; if (listaDocumentos.Count > 0) { archivoResult = GeneraExcelBO.GeneraExcel<DocumentosEO>(paramsExc, listaDocumentos); if (!archivoResult.TieneError) { System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + paramsExc.NombreArchivo); System.Web.HttpContext.Current.Response.BinaryWrite(archivoResult.Archivo); jsonResultado = new GenericaEO(); jsonResultado.TieneError = resultado.TieneError; jsonResultado.Mensaje = "Se Ha Generado Correctamente El Reporte En Excel De Transacciones"; jsonResultado.Contenido = resultado.Resultado.Count.ToString(); } else { jsonResultado = new GenericaEO(); jsonResultado.TieneError = true; jsonResultado.Mensaje = archivoResult.Mensaje; jsonResultado.Contenido = resultado.Resultado.Count.ToString(); } } else { jsonResultado = new GenericaEO(); jsonResultado.TieneError = true; jsonResultado.Mensaje = "No Se Encontraron Registros Para Los Criterios De Búsqueda Ingresados."; jsonResultado.Contenido = resultado.Resultado.Count.ToString(); }
3.- Devuelvo un json diciendo que se genero o no
4.- Jquery me devuelve error en Token P Json y nunca me descarga archivo
Pueden ayudarme con esto?
- Editado Don Nestorin jueves, 31 de agosto de 2017 14:37 Ingreso Mas Codigo
Todas las respuestas
-
3.- Devuelvo un json diciendo que se genero o no
-
3.- Devuelvo un json diciendo que se genero o no
Pero con las líneas de código que has mostrado no estás devolviendo un JSON. Estás devolviendo en binario el contenido del archivo. Ese contenido binario casi con toda seguridad no será un JSON, por lo que no es de extrañar que jquery se queje de que no puede deserializarlo.
Cuando Realizo Pruebas Se va por ql bloque de OK o sea (HelperITO.Serializa(jsonResultado)
*
"Se Ha Generado Correctamente El Reporte En Excel De Transacciones SRI";
*
- Editado Don Nestorin jueves, 31 de agosto de 2017 14:38
-
Si se sale lo de "Se Ha Generado Correctamente El Reporte ..." quiere decir que previamente ha ejecutado las líneas de código que hay encima. Y una de esas líneas es
System.Web.HttpContext.Current.Response.BinaryWrite(...)
Con esa línea se machaca el Response y se inyectan en la respuesta los datos binarios, con lo que esa respuesta que se devuelve al navegador ya no se podrá deserializar como JSON, con independencia de cualquier cosa que devuelvas en otro sitio del programa.
-
-
Si quieres hacerlo con una única llamada al servidor, entonces por ejemplo podrías devolver el binario del fichero en el Response, tal como lo estás haciendo, y el éxito/fallo devolverlo en el Status de HTTP (Si tiene éxito la generación del fichero, se devuelve un 200 OK en el status y el cuerpo del Response trae el binario del fichero; si algo falla, se devuelve un Status 500 Internal Error, y el cuerpo del Response trae el mensaje con la explicación del error).
Esto implica que no hay JSON por ninguna parte. Desde la llamada con el ajax de jquery te llega el "data" con el binario si hay un "success", y te llega el data con el mensaje de error si hay un "error".
En el lado servidor, te quedaría más limpio con un .ashx que con el .asmx. Basta que pongas el fichero en el Response.BinaryWrite, como ya estás haciendo, y que en el Response.Status y .StatusCode pongas el valor correspondiente para éxito/error.
-