Heim >Backend-Entwicklung >C++ >Wie lade ich mit AngularJS effizient Dateien von ASP.NET-Web-APIs herunter?

Wie lade ich mit AngularJS effizient Dateien von ASP.NET-Web-APIs herunter?

Linda Hamilton
Linda HamiltonOriginal
2025-01-03 10:44:40132Durchsuche

How to Efficiently Download Files from ASP.NET Web APIs Using AngularJS?

Herunterladen von Dateien von ASP.NET-Web-APIs mit AngularJS

In einer AngularJS-Anwendung können Sie HTTP-GET-Anfragen an eine ASP.NET-Web-API-Methode auslösen, um Dateien abzurufen . Die Handhabung der heruntergeladenen Datei erfordert jedoch weitere Schritte, um den eigentlichen Downloadvorgang zu erleichtern.

Verwendung einer einfachen Download-Methode

Um einen einfachen Download auszulösen, muss die Funktion window.open verwendet werden:

$scope.downloadFile = function(downloadPath) { 
    window.open(downloadPath, '_blank', '');  
}

Diese Methode initiiert einen direkten Download ohne Verwendung von AJAX.

Implementierung eines AJAX-Binär-Downloads Methode

Für einen effizienteren Ansatz, der mehrere Browser unterstützt, sollten Sie die folgende Implementierung in Betracht ziehen:

$scope.downloadFile = function(httpPath) {
    // Use an arraybuffer
    $http.get(httpPath, { responseType: 'arraybuffer' })
    .success( function(data, status, headers) {

        var octetStreamMime = 'application/octet-stream';
        var success = false;

        // Get the headers
        headers = headers();

        // Get the filename from the x-filename header or default to "download.bin"
        var filename = headers['x-filename'] || 'download.bin';

        // Determine the content type from the header or default to "application/octet-stream"
        var contentType = headers['content-type'] || octetStreamMime;

        try
        {
            // Try using msSaveBlob if supported
            console.log("Trying saveBlob method ...");
            var blob = new Blob([data], { type: contentType });
            if(navigator.msSaveBlob)
                navigator.msSaveBlob(blob, filename);
            else {
                // Try using other saveBlob implementations, if available
                var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
                if(saveBlob === undefined) throw "Not supported";
                saveBlob(blob, filename);
            }
            console.log("saveBlob succeeded");
            success = true;
        } catch(ex)
        {
            console.log("saveBlob method failed with the following exception:");
            console.log(ex);
        }

        if(!success)
        {
            // Get the blob url creator
            var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
            if(urlCreator)
            {
                // Try to use a download link
                var link = document.createElement('a');
                if('download' in link)
                {
                    // Try to simulate a click
                    try
                    {
                        // Prepare a blob URL
                        console.log("Trying download link method with simulated click ...");
                        var blob = new Blob([data], { type: contentType });
                        var url = urlCreator.createObjectURL(blob);
                        link.setAttribute('href', url);

                        // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
                        link.setAttribute("download", filename);

                        // Simulate clicking the download link
                        var event = document.createEvent('MouseEvents');
                        event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                        link.dispatchEvent(event);
                        console.log("Download link method with simulated click succeeded");
                        success = true;

                    } catch(ex) {
                        console.log("Download link method with simulated click failed with the following exception:");
                        console.log(ex);
                    }
                }

                if(!success)
                {
                    // Fallback to window.location method
                    try
                    {
                        // Prepare a blob URL
                        // Use application/octet-stream when using window.location to force download
                        console.log("Trying download link method with window.location ...");
                        var blob = new Blob([data], { type: octetStreamMime });
                        var url = urlCreator.createObjectURL(blob);
                        window.location = url;
                        console.log("Download link method with window.location succeeded");
                        success = true;
                    } catch(ex) {
                        console.log("Download link method with window.location failed with the following exception:");
                        console.log(ex);
                    }
                }

            }
        }

        if(!success)
        {
            // Fallback to window.open method
            console.log("No methods worked for saving the arraybuffer, using last resort window.open");
            window.open(httpPath, '_blank', '');
        }
    })
    .error(function(data, status) {
        console.log("Request failed with status: " + status);

        // Optionally write the error out to scope
        $scope.errorDetails = "Request failed with status: " + status;
    });
};

Verwendung und Hinweise

Um die verbesserte Methode zu verwenden:

var downloadPath = "/files/instructions.pdf";
$scope.downloadFile(downloadPath);

Hinweis: Denken Sie daran, die entsprechenden Header in Ihre Web-API aufzunehmen Methode:

  • x-Dateiname für den Dateinamen
  • Inhaltstyp für den MIME-Typ

Das obige ist der detaillierte Inhalt vonWie lade ich mit AngularJS effizient Dateien von ASP.NET-Web-APIs herunter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn