IE11在没有扩展名的情况下从Web API保存文件

时间:2016-02-12 12:08:41

标签: c# asp.net-web-api internet-explorer-11

我有Angular SPA,它使用以下方法从ASP.NET Web API 2下载文件:

Angular Code

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

httpPath是我的Web API控制器的URL。控制器具有以下代码:

Web API代码

    [HttpGet]
    [Authorize]
    public async Task<HttpResponseMessage> DownloadItems(string path)
    {
        try
        {
            Stream stream = await documentsRepo.getStream(path);
            HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentDisposition =
                new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = "document.zip",
                };
            result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentLength = stream.Length;
            return result;
        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
        }
    }

上述设置在所有浏览器中都能很好地工作(下载.zip文件),IE11除外。

由于未知原因,IE11下载的文件没有.zip扩展名

知道我的API控制器有什么问题吗?

0 个答案:

没有答案