Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk memuat turun fail dengan cekap dari API Web ASP.NET Menggunakan AngularJS?

Bagaimana untuk memuat turun fail dengan cekap dari API Web ASP.NET Menggunakan AngularJS?

Linda Hamilton
Linda Hamiltonasal
2025-01-03 10:44:40133semak imbas

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

Memuat turun Fail daripada API Web ASP.NET Menggunakan AngularJS

Dalam aplikasi AngularJS, anda boleh mencetuskan permintaan HTTP GET kepada kaedah API Web ASP.NET untuk mendapatkan semula fail . Walau bagaimanapun, pengendalian fail yang dimuat turun memerlukan langkah selanjutnya untuk memudahkan proses muat turun sebenar.

Menggunakan Kaedah Muat Turun Mudah

Mecetuskan muat turun asas melibatkan penggunaan fungsi window.open:

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

Kaedah ini memulakan muat turun terus tanpa menggunakan AJAX.

Melaksanakan AJAX Kaedah Muat Turun Binari

Untuk pendekatan yang lebih cekap yang menyokong berbilang penyemak imbas, pertimbangkan untuk menggunakan pelaksanaan berikut:

$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;
    });
};

Penggunaan dan Nota

Untuk menggunakan kaedah yang dipertingkatkan:

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

Nota: Ingat untuk memasukkan pengepala yang sesuai dalam API Web anda kaedah:

  • x-nama fail untuk nama fail
  • jenis kandungan untuk jenis MIME

Atas ialah kandungan terperinci Bagaimana untuk memuat turun fail dengan cekap dari API Web ASP.NET Menggunakan AngularJS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn