任何帮助都是最受欢迎的,非常感谢。
我有一个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时,我正在执行操作,完成后浏览器正在按预期处理文件。
有没有人能想到如何按预期完成“帖子”?
谢谢,
埃拉德
答案 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;
};
};