使用AngularJS和$ http.post在MVC应用程序中下载文件

时间:2014-11-03 06:07:52

标签: javascript asp.net-mvc angularjs asp.net-mvc-4 download

任何帮助都是最受欢迎的,非常感谢。

我有一个MVC操作,它会从Web服务重试文件内容。使用$http.post(action, model)从Angular服务(位于services.js)调用此操作,操作返回FileContentResult对象,该对象包含字节数组和内容类型。

public ActionResult DownloadResults(DownloadResultsModel downloadResultsModel)
{
downloadResult = ... // Retrieving the file from a web service
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", downloadResult.FileName));
Response.BufferOutput = false;
return new FileContentResult(downloadResult.Contents, downloadResult.ContentType);
}

我遇到的问题是浏览器没有执行处理文件的默认行为(例如,提示打开,保存或取消)。具有文件内容和文件名(注入FileContentResult对象),操作成功完成,但浏览器没有响应。

当我用$window.location.href替换帖子并自己构建URI时,我正在执行操作,完成后浏览器正在按预期处理文件。

有没有人能想到如何按预期完成“帖子”?

谢谢,

埃拉德

1 个答案:

答案 0 :(得分:2)

我使用下面的代码下载文件,假设文件确实存在于服务器上,而客户端正在向服务器发送文件的完整路径......

根据您的要求更改代码以指定服务器本身的路径。

    [HttpGet]
    public HttpResponseMessage DownloadFile(string filename)
    {
        filename = filename.Replace("\\\\", "\\").Replace("'", "").Replace("\"", "");
        if (!char.IsLetter(filename[0]))
        {
            filename = filename.Substring(2);
        }

        var fileinfo = new FileInfo(filename);
        if (!fileinfo.Exists)
        {
            throw new FileNotFoundException(fileinfo.Name);
        }

        try
        {
            var excelData = File.ReadAllBytes(filename);
            var result = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new MemoryStream(excelData);
            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = fileinfo.Name
            };
            return result;
        }
        catch (Exception ex)
        {
            return Request.CreateResponse(HttpStatusCode.ExpectationFailed, ex);
        }
    }

然后在客户端以角度显示:

    var downloadFile = function (filename) {
        var ifr = document.createElement('iframe');
        ifr.style.display = 'none';
        document.body.appendChild(ifr);
        ifr.src = document.location.pathname + "api/GridApi/DownloadFile?filename='" + escape(filename) + "'";
        ifr.onload = function () {
            document.body.removeChild(ifr);
            ifr = null;
        };
    };