这是我的web-api代码:
[HttpPost]
public HttpResponseMessage PostFileAsAttachment()
{
string path = "D:\\heroAccent.png";
if (File.Exists(path))
{
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "xx.png";
return result;
}
return new HttpResponseMessage(HttpStatusCode.NotFound);
}
如何编写客户端(视图)强制下载文件给我(如自动下载模式(打开,另存为)可以弹出...)
答案 0 :(得分:2)
如上所述,您无法从ajax触发“打开/另存为”对话框。
如果您想在下载文件时保留当前页面内容,可以在页面的某处添加隐藏的iframe,并让您的下载链接在幕后执行一些JS来设置 src 属性把iframe说到适当的位置。
$('iframeSelector').attr('src', downloadLinkLocation)
我已经使用返回 FileContentResult 的操作对此进行了测试,但如果您在响应标头中设置了 ContentDisposition ,就像您一样,我认为没有理由说它不会使用WebAPI方法。
答案 1 :(得分:0)
可用于文件的ActionResult类型之一是FileResult 如果要传输的内容存储在磁盘文件中,则可以使用FilePathResult对象。如果您的内容可通过流使用,则使用FileStreamResult,如果您将其作为字节数组提供,则选择FileContentResult。所有这些对象都派生自FileResult,并且只有在将数据写入响应流的方式上才会彼此不同。
ex:for PDF
public FileResult Export()
{
var output = new MemoryStream();
:
return File(output.ToArray(), "application/pdf", "MyFile.pdf");
}
请找到以下链接,了解如何使用Ajax Jquery调用action方法
http://blog.bobcravens.com/2009/11/ajax-calls-to-asp-net-mvc-action-methods-using-jquery/
你可以参考这篇文章,它们可以让你对FileResult
有所了解