我正在开发一个ASP.NET MVC3应用程序。我有一个文件下载控制器:
public ActionResult PDF(string id)
{
try
{
// here I unzip a file, DownName comes from here
Response.Clear();
Response.AddHeader("Content-Disposition",
"attachment; filename=" + id + ".pdf");
Response.ContentType = "application/pdf";
Response.WriteFile(DownName);
Response.Flush();
Response.Close();
System.IO.File.Delete(DownName);
return View();
}
catch (Exception)
{
message = "File not found.";
}
return Json(new { message = message }, JsonRequestBehavior.AllowGet);
}
在客户端,我需要获取此PDF文件。但是,如果找不到该文件,我将提醒“未找到文件”这样的文本。我尝试了很多方法并最终进入了这个方面:
$(function(){
$(".pdf").click(function(e) {
e.preventDefault();
$.post("@Url.Action("PDF","Helper")",{id : $(this).data("id")},function(data){
if(data.message == "File not found.") {
alert(data.message);
} else {
alert(data);
}
});
});
});
如果找不到文件,我可以成功提醒错误消息。如何在此处打开数据的保存对话框?我也可以为控制器工作的任何其他方式。
编辑:如果我像这样调用控制器,我可以轻松下载文件:
<a href="../../Helper/PDF/@Model.ID">Download PDF</a>
但是,如果结果不是文件和JSON,则页面将重定向到显示JSON对象的空白页面。我希望它像我之前所说的那样警惕屏幕。我也很欣赏这种方法的解决方法。
答案 0 :(得分:3)
您必须从操作中返回FileResult。否则,您将无法告诉浏览器下载该文件。 使用javascript使用异步请求请求文件数据时,您无法触发浏览器将该数据保存到本地文件。
当您必须能够检查文件是否存在时,您必须提供两个操作:
public JsonResult PDFAvailable(string id) {
// check if the file is there
return Json(new { message = message }, JsonRequestBehavior.AllowGet);
}
public FileResult PDF(string id) {
// get the filedata
byte[] fileData = ...;
return File(fileData, "application/pdf");
}
在您的视图中,您使用PDFAvailable操作ID检查文件是否存在。如果没有显示您的消息,请以正常请求调用PDF操作:
window.location.href =
'@Url.Action("PDF", "YourController", new { id = "yourFileId" })';
修改强>
关于chrome的问题并设置location.href
:这在chrome中肯定有用。只需进行测试:使用以下内容创建一个html文件:
<script>
location.href = "http://www.google.com";
</script>
然后用chrome打开它。它应该将您的浏览器重定向到谷歌主页。如果是这样,您的代码还有其他一些问题。如果没有,请告诉我您使用的是哪个版本的chrome。