【问题标题】:Setting up application to download a file in asp.net MVC - Nothing happening on return from download设置应用程序以在 asp.net MVC 中下载文件 - 从下载返回时没有任何反应
【发布时间】:2013-12-10 16:48:50
【问题描述】:

我意识到以前有人问过这个问题的变体。我找到的最佳答案在

File download in Asp.Net MVC 2

但尝试遵循这些说明并没有解决我的问题。

长话短说,文件被正确检索,名称、路径和 mime 类型都正确,并且没有抛出错误。客户端的 javascript 也不会引发错误。

获取文件的 C# 代码如下所示:

[HttpPost]
public FileResult DownloadFile(int fileId)
{
    ... get the file and file info
    return File(fileBytes, fileMimeType, fileName);
}

javascript 看起来像这样:

... set up for post here
$.post(settings.actions.downloadFile, {fileId: fileIdVar});

正如我所说,帖子返回并且没有任何反应。

我试过把post改成get,结果还是一样。

我尝试设置一个回调函数,将 document.location.href 设置为从下载返回时的某个随机 url,但这只会将我的浏览器带到我指定的页面。从我提供的链接中给出的解释来看,我无法理解,即

"...使用 document.location.href = ... 告诉浏览器转到下载文件的 url。它会看到内容处置标题并将其显示为下载而不是页面……”

我应该将浏览器指向的内容。 document.location.href 不接受数据,所以我不能单独使用它,并且使用没有 document.location.href 的 post 不会返回任何内容。

我做错了什么?

非常感谢响应者的宝贵时间!

【问题讨论】:

  • 我认为问题在于 POST 是通过 AJAX 完成的。如果您发布标准帖子,您可能可以毫无问题地下载文件
  • 这听起来是个好主意,Queti,但我如何在 javascript 中做到这一点?也就是说,我如何在不使用 $.post 的情况下发布,它使用 ajax?你是说我应该设置一个不同的机制,比如我的html中的一个表单?
  • 是的,使用 POST 方法设置表单。如果您仍然需要在表单发送到服务器之前进行某种验证或修改数据,您仍然可以这样做,您只需使用$(form).submit() 触发表单提交。
  • 再次感谢您的帮助,奎蒂。作为一个完整的问题,是否可以动态创建一个表单,让我下载一个文件,然后在我的 javascript 中提交该表单?
  • 反对票有什么用?不会……政治……会吗?那太傻了。

标签: c# asp.net-mvc


【解决方案1】:

就像您链接的帖子中的答案所说,您无法通过 AJAX 下载文件。

为了设置位置,更改您的操作以响应 GET 请求,并将您的文件 ID 添加到查询字符串或设置路由来处理它。此外,您可能已经这样做了,但您需要确保将 Content-Dispostion 标头值设置为 attachment

window.location.href = settings.action.downloadFile + "?fileId=" + fileIdVar

由于您使用的是 jQuery,您可以使用$.param 为您构建参数。

您还可以查看 plugin 以提供“类似 AJAX”的体验。

【讨论】:

  • 感谢您的帮助,Rfvgyhn!最终对我有用的是更改 document.location.href,正如您建议的那样,不使用 ajax 调用。此行正确地让我下载文件: document.location.href = settings.actions.downloadFile + "?fileId=" + fileIdVar;
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多