In meinem Angular JS-Projekt habe ich ein <a>
Ankertag, das beim Klicken eine HTTP- GET
Anforderung an eine WebAPI-Methode sendet, die eine Datei zurückgibt.
Jetzt möchte ich, dass die Datei auf den Benutzer heruntergeladen wird, sobald die Anforderung erfolgreich ist. Wie mache ich das?
Das Ankertag:
<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) {
// ...
});
}
Meine WebAPI-Methode:
[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
quelle
quelle
Antworten:
Die Unterstützung für das Herunterladen von Binärdateien mit Ajax ist nicht großartig, sie wird derzeit noch als Arbeitsentwurf entwickelt .
Einfache Download-Methode:
Sie können den Browser die angeforderte Datei einfach mithilfe des folgenden Codes herunterladen lassen. Dies wird in allen Browsern unterstützt und löst die WebApi-Anforderung offensichtlich trotzdem aus.
Ajax binäre Download-Methode:
Die Verwendung von Ajax zum Herunterladen der Binärdatei kann in einigen Browsern erfolgen. Im Folgenden finden Sie eine Implementierung, die in den neuesten Versionen von Chrome, Internet Explorer, FireFox und Safari funktioniert.
Es wird ein
arraybuffer
Antworttyp verwendet, der dann in ein JavaScript konvertiert wirdblob
, das dann entweder zum Speichern mithilfe dersaveBlob
Methode angezeigt wird - obwohl dies derzeit nur in Internet Explorer vorhanden ist - oder in eine Blob-Daten-URL umgewandelt wird, die vom Browser geöffnet und ausgelöst wird Der Download-Dialog, wenn der MIME-Typ für die Anzeige im Browser unterstützt wird.Internet Explorer 11-Unterstützung (behoben)
Hinweis: Internet Explorer 11 mochte die Verwendung der
msSaveBlob
Funktion nicht, wenn sie mit einem Alias versehen war - möglicherweise eine Sicherheitsfunktion, aber eher ein Fehler. Die Verwendungvar saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
zur Ermittlung der verfügbarensaveBlob
Unterstützung verursachte also eine Ausnahme. Daher wird der folgende Code jetztnavigator.msSaveBlob
separat getestet . Vielen Dank? MicrosoftVerwendung:
Anmerkungen:
Sie sollten Ihre WebApi-Methode ändern, um die folgenden Header zurückzugeben:
Ich habe den
x-filename
Header verwendet, um den Dateinamen zu senden. Dies ist der Einfachheit halber ein benutzerdefinierter Header. Sie können den Dateinamen jedochcontent-disposition
mit regulären Ausdrücken aus dem Header extrahieren .Sie sollten den
content-type
MIME-Header auch für Ihre Antwort festlegen , damit der Browser das Datenformat kennt.Ich hoffe das hilft.
quelle
window.open
wird vorgeschlagen.C # WebApi PDF-Download alle, die mit Angular JS Authentication arbeiten
Web-API-Controller
Angular JS Service
Entweder wird man tun
Angular JS Controller, der den Dienst aufruft
Und zuletzt die HTML-Seite
Dies wird überarbeitet, indem nur der Code geteilt wird. Ich hoffe, es hilft jemandem, da ich eine Weile gebraucht habe, um dies zum Laufen zu bringen.
quelle
Für mich war die Web-API Rails und clientseitig Angular, die mit Restangular und FileSaver.js verwendet wurden
Web-API
HTML
Winkelregler
Winkelservice
quelle
Wir mussten auch eine Lösung entwickeln, die sogar mit APIs funktioniert, die eine Authentifizierung erfordern (siehe diesen Artikel ).
AngularJS auf den Punkt gebracht: So haben wir es gemacht:
Schritt 1: Erstellen Sie eine dedizierte Direktive
Schritt 2: Erstellen Sie eine Vorlage
Schritt 3: Verwenden Sie es
Dadurch wird eine blaue Schaltfläche gerendert. Wenn Sie darauf klicken, wird ein PDF heruntergeladen (Achtung: Das Backend muss das PDF in Base64-Codierung liefern!) Und in die href eingefügt. Die Schaltfläche wird grün und schaltet den Text auf Speichern . Der Benutzer kann erneut klicken und erhält einen Standarddialog für die Download-Datei für die Datei my-awesome.pdf .
quelle
Senden Sie Ihre Datei als base64-Zeichenfolge.
Wenn die attr-Methode in Firefox nicht funktioniert Sie können auch die JavaScript-Methode setAttribute verwenden
quelle
Sie können eine Showfile-Funktion implementieren, die Parameter der von WEBApi zurückgegebenen Daten und einen Dateinamen für die Datei, die Sie herunterladen möchten, berücksichtigt. Ich habe einen separaten Browserdienst erstellt, der den Browser des Benutzers identifiziert und dann das Rendern der Datei basierend auf dem Browser übernimmt. Wenn der Zielbrowser beispielsweise auf einem iPad verchromt ist, müssen Sie das FileReader-Objekt javascripts verwenden.
quelle
Ich habe eine Reihe von Lösungen durchlaufen und festgestellt, dass dies für mich großartig funktioniert hat.
In meinem Fall musste ich eine Post-Anfrage mit einigen Anmeldeinformationen senden. Ein kleiner Aufwand bestand darin, dem Skript eine Abfrage hinzuzufügen. War es aber wert.
quelle
In Ihrer Komponente, dh Winkel js Code:
quelle