En mi proyecto Angular JS, tengo una <a>
etiqueta de anclaje, que al hacer clic hace una GET
solicitud HTTP a un método WebAPI que devuelve un archivo.
Ahora, quiero que el archivo se descargue al usuario una vez que la solicitud sea exitosa. ¿Cómo puedo hacer eso?
La etiqueta de anclaje:
<a href="#" ng-click="getthefile()">Download img</a>
AngularJS:
$scope.getthefile = function () {
$http({
method: 'GET',
cache: false,
url: $scope.appPath + 'CourseRegConfirm/getfile',
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
}).success(function (data, status) {
console.log(data); // Displays text data if the file is a text file, binary if it's an image
// What should I write here to download the file I receive from the WebAPI method?
}).error(function (data, status) {
// ...
});
}
Mi método WebAPI:
[Authorize]
[Route("getfile")]
public HttpResponseMessage GetTestFile()
{
HttpResponseMessage result = null;
var localFilePath = HttpContext.Current.Server.MapPath("~/timetable.jpg");
if (!File.Exists(localFilePath))
{
result = Request.CreateResponse(HttpStatusCode.Gone);
}
else
{
// Serve the file to the client
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "SampleImg";
}
return result;
}
c#
javascript
html
angularjs
asp.net-web-api
whereDragonsDwell
fuente
fuente
Respuestas:
La compatibilidad para descargar archivos binarios al usar ajax no es excelente, todavía está en desarrollo como borradores de trabajo .
Método de descarga simple:
Puede hacer que el navegador descargue el archivo solicitado simplemente usando el código a continuación, y esto es compatible con todos los navegadores, y obviamente activará la solicitud de WebApi de la misma manera.
Método de descarga binaria Ajax:
El uso de ajax para descargar el archivo binario se puede hacer en algunos navegadores y a continuación se muestra una implementación que funcionará en las últimas versiones de Chrome, Internet Explorer, Firefox y Safari.
Utiliza un
arraybuffer
tipo de respuesta, que luego se convierte en JavaScriptblob
, que luego se presenta para guardar usando elsaveBlob
método, aunque actualmente solo está presente en Internet Explorer, o se convierte en una URL de datos de blob que abre el navegador, activando el diálogo de descarga si el tipo mime es compatible para ver en el navegador.Soporte de Internet Explorer 11 (fijo)
Nota: a Internet Explorer 11 no le gustaba usar la
msSaveBlob
función si tenía un alias, quizás una característica de seguridad, pero más probablemente un defecto, por lo que usarvar saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
para determinar elsaveBlob
soporte disponible causó una excepción; por lo tanto, el siguiente código ahora prueba pornavigator.msSaveBlob
separado. ¿Gracias? MicrosoftUso:
Notas:
Debe modificar su método WebApi para devolver los siguientes encabezados:
He usado el
x-filename
encabezado para enviar el nombre del archivo. Este es un encabezado personalizado para su comodidad, sin embargo, puede extraer el nombre de archivo delcontent-disposition
encabezado utilizando expresiones regulares.También debe configurar el
content-type
encabezado mime para su respuesta, de modo que el navegador conozca el formato de datos.Espero que esto ayude.
fuente
window.open
.Descarga de C # WebApi PDF todo funciona con autenticación angular JS
Controlador de API web
Servicio angular JS
Cualquiera de los dos lo hará
Angular JS Controller llamando al servicio
Y por último la página HTML
Esto se refactorizará solo compartiendo el código, ahora espero que ayude a alguien, ya que me tomó un tiempo hacer que esto funcione.
fuente
Para mí, la API web era Rails y Angular del lado del cliente utilizado con Restangular y FileSaver.js
API web
HTML
Controlador angular
Servicio angular
fuente
También tuvimos que desarrollar una solución que incluso funcionara con API que requieren autenticación (ver este artículo )
Usando AngularJS en pocas palabras, así es como lo hicimos:
Paso 1: crear una directiva dedicada
Paso 2: crea una plantilla
Paso 3: úsalo
Esto generará un botón azul. Al hacer clic, se descargará un PDF (Precaución: ¡el backend tiene que entregar el PDF en codificación Base64!) Y se colocará en el href. El botón se vuelve verde y cambia el texto a Guardar . El usuario puede hacer clic nuevamente y se le presentará un cuadro de diálogo de descarga estándar para el archivo my-awesome.pdf .
fuente
Envíe su archivo como una cadena base64.
Si el método attr no funciona en Firefox, también puede usar el método setAttribute de javaScript
fuente
Puede implementar una función showfile que tome parámetros de los datos devueltos por WEBApi y un nombre de archivo para el archivo que está intentando descargar. Lo que hice fue crear un servicio de navegador separado que identifica el navegador del usuario y luego maneja la representación del archivo en función del navegador. Por ejemplo, si el navegador de destino es Chrome en un ipad, debe usar el objeto javascripts FileReader.
fuente
He pasado por una variedad de soluciones y esto es lo que descubrí que funcionó muy bien para mí.
En mi caso, necesitaba enviar una solicitud de publicación con algunas credenciales. Una pequeña sobrecarga fue agregar jquery dentro del script. Pero valió la pena.
fuente
En su componente, es decir, código js angular:
fuente