ホームページ >バックエンド開発 >C++ >AngularJS を使用して ASP.NET Web API からファイルを効率的にダウンロードするにはどうすればよいですか?

AngularJS を使用して ASP.NET Web API からファイルを効率的にダウンロードするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-03 10:44:40129ブラウズ

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

AngularJS を使用した ASP.NET Web API からのファイルのダウンロード

AngularJS アプリケーションでは、ASP.NET Web API メソッドへの HTTP GET リクエストをトリガーしてファイルを取得できます。 。ただし、ダウンロードしたファイルを処理するには、実際のダウンロード プロセスを促進するためのさらなる手順が必要です。

単純なダウンロード方法の使用

基本的なダウンロードのトリガーには、window.open 関数の利用が含まれます:

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

このメソッドは、AJAX を利用せずに直接ダウンロードを開始します。

AJAX バイナリ ダウンロードの実装メソッド

複数のブラウザをサポートするより効率的なアプローチについては、次の実装の使用を検討してください:

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

使用法と注意事項

改善されたメソッドを使用するには:

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

注: Web API に適切なヘッダーを忘れずに含めてください。メソッド:

  • ファイル名の x-filename
  • MIME タイプの content-type

以上がAngularJS を使用して ASP.NET Web API からファイルを効率的にダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。