Dans mon projet Angular JS, j'ai une <a>
balise d'ancrage qui, lorsqu'elle est cliquée, GET
envoie une requête HTTP à une méthode WebAPI qui renvoie un fichier.
Maintenant, je veux que le fichier soit téléchargé vers l'utilisateur une fois la demande réussie. Comment je fais ça?
La balise d'ancrage:
<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) {
// ...
});
}
Ma méthode 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
oùDragonsDwell
la source
la source
Réponses:
Le support du téléchargement de fichiers binaires en utilisant ajax n'est pas génial, il est encore en cours de développement en tant que brouillons de travail .
Méthode de téléchargement simple:
Vous pouvez demander au navigateur de télécharger le fichier demandé simplement en utilisant le code ci-dessous, ce qui est pris en charge dans tous les navigateurs et déclenchera évidemment la requête WebApi de la même manière.
Méthode de téléchargement binaire Ajax:
L'utilisation d'ajax pour télécharger le fichier binaire peut être effectuée dans certains navigateurs et ci-dessous se trouve une implémentation qui fonctionnera dans les dernières versions de Chrome, Internet Explorer, FireFox et Safari.
Il utilise un
arraybuffer
type de réponse, qui est ensuite converti en JavaScriptblob
, qui est ensuite présenté pour être enregistré à l'aide de lasaveBlob
méthode - bien que ce ne soit actuellement présent que dans Internet Explorer - ou transformé en une URL de données blob qui est ouverte par le navigateur, déclenchant la boîte de dialogue de téléchargement si le type mime est pris en charge pour l'affichage dans le navigateur.Prise en charge d'Internet Explorer 11 (fixe)
Remarque: Internet Explorer 11 n'aimait pas utiliser la
msSaveBlob
fonction si elle avait été aliasée - peut-être une fonction de sécurité, mais plus probablement une faille, donc l'utilisationvar saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
pour déterminer lesaveBlob
support disponible a provoqué une exception; d'où pourquoi le code ci-dessous teste maintenantnavigator.msSaveBlob
séparément. Merci? MicrosoftUsage:
Remarques:
Vous devez modifier votre méthode WebApi pour renvoyer les en-têtes suivants:
J'ai utilisé l'en-
x-filename
tête pour envoyer le nom de fichier. Il s'agit d'un en-tête personnalisé pour plus de commodité, vous pouvez cependant extraire le nom de fichier de l'en-content-disposition
tête à l'aide d'expressions régulières.Vous devez également définir l'en-
content-type
tête mime pour votre réponse, afin que le navigateur connaisse le format des données.J'espère que ça aide.
la source
window.open
est suggérée.C # WebApi PDF télécharger tous fonctionnant avec l'authentification Angular JS
Contrôleur d'API Web
Service JS angulaire
L'un ou l'autre fera l'affaire
Angular JS Controller appelant le service
Et enfin la page HTML
Cela sera remanié en partageant simplement le code maintenant, j'espère que cela aidera quelqu'un car il m'a fallu un certain temps pour que cela fonctionne.
la source
Pour moi, l'API Web était Rails et Angular côté client utilisé avec Restangular et FileSaver.js
API Web
HTML
Contrôleur angulaire
Service angulaire
la source
Nous avons également dû développer une solution qui fonctionnerait même avec des API nécessitant une authentification (voir cet article )
Utiliser AngularJS en un mot, voici comment nous l'avons fait:
Étape 1: créer une directive dédiée
Étape 2: créer un modèle
Étape 3: utilisez-le
Cela rendra un bouton bleu. Une fois cliqué, un PDF sera téléchargé (Attention: le backend doit livrer le PDF en encodage Base64!) Et placé dans le href. Le bouton devient vert et fait passer le texte à Enregistrer . L'utilisateur peut cliquer à nouveau et sera présenté avec une boîte de dialogue de téléchargement standard du fichier my-awesome.pdf .
la source
Envoyez votre fichier sous forme de chaîne base64.
Si la méthode attr ne fonctionne pas dans Firefox, vous pouvez également utiliser la méthode javaScript setAttribute
la source
Vous pouvez implémenter une fonction showfile qui prend en paramètres les données renvoyées par le WEBApi, et un nom de fichier pour le fichier que vous essayez de télécharger. Ce que j'ai fait, c'est de créer un service de navigateur distinct qui identifie le navigateur de l'utilisateur, puis gère le rendu du fichier en fonction du navigateur. Par exemple, si le navigateur cible est chrome sur un ipad, vous devez utiliser l'objet javascripts FileReader.
la source
J'ai parcouru une gamme de solutions et c'est ce que j'ai trouvé qui a très bien fonctionné pour moi.
Dans mon cas, j'avais besoin d'envoyer une demande de publication avec quelques informations d'identification. Une petite surcharge était d'ajouter jquery à l'intérieur du script. Mais ça valait le coup.
la source
Dans votre composant ie code js angulaire:
la source