2017-08-01 79 views
-1

远远望去,仍然无法找到一种方法从POST表单同步下载生成的文件。我知道这个过程是异步的,但我想让用户等待,或允许他们下载其他文件,而其他人正在下载。MVC 5 C#,正在下载

我的页面向用户询问文件ID,然后生成该文件并向用户发送请求的文件。他们要么等待,要么继续下载其他文件,并在每个文件出现时获取“文件保存”对话框。

只要用户在最后一个请求没有完成下载时询问新文件,该进程就会被取消,只有新的请求被处理(下载)。

我尝试使用Ajax(jQuery),但它不工作。我可以等待上传,但不能下载,另外还有一个安全问题,显示文件的URL,该文件从不保存在服务器上。

任何帮助,将不胜感激。

C#代码

从这里
[HttpPost] 
public ActionResult GetFile(int id) 
{  
    //code  
    return File(fileData, contentType, originalFileName); 
} 
+0

你忽略了问一个问题。 – Amy

回答

0
public FileResult Download() 
{ 
    byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext"); 
    string fileName = "myfile.ext"; 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
} 

被盗。 Download file of any type in Asp.Net MVC using FileResult?

+0

嗨,我这样做,我需要一个用户端下载完成事件的解决方案。没有Ajax文件在飞行中生成。 –

+0

这听起来像你正在使它比需要更难,只需生成一个链接,让浏览器处理下载。你应该使用GET而不是帖子。你的用例是什么? – CountZero

+0

正如文件下载,但我需要显示用户的进展或简单的事实,即文件是在它的方式,就是这样。根本不算复杂,但解决方案并不明显,因为这里涉及的异步任务是以您发布的示例返回文件。有什么方法可以知道浏览器是否忙于GET或POST?可能会添加一个我不知道的js事件? –

0

我曾经提出这样一个解决方案:

<form ... target="my_iframe"> 
</form> 

<iframe name="my_iframe" style="display:none"></iframe> 

隐藏的iframe将处理表单提交,其中包括等待下载开始,然后弹出保存对话框。


请注意,如果您的下载可能失败 - 并且失败始终是一个选项! - 那么失败的输出也将在iframe中结束,并且因为它被隐藏,用户将看不到它。

我解决了这个由具有表单处理代码在服务器上同时产生的File(如果可能)和Cookie,将包含“OK”或“ERROR”,然后使用JavaScript为Cookie每个〜250ms的轮询。在出现“错误”的情况下,我将一些iframe内容复制到了我的表单下面的错误部分。

+0

嗨,彼得,我见过这样做,还没有尝试过,但我需要为每个请求保持创建新的iframe,所以我不张贴到相同的iframe并取消最后的请求?我怎样才能使用这种方法,并保持用户在下载完成之前请求其他文件?干杯, –

+0

您可以使用多个隐藏的iframe,可以使用javascript或jQuery动态修改或添加到页面中,并相应地旋转“form”的“target”。 –

+0

如何检测iframe何时完成下载文件,以便我可以保持一个gif动画并禁用下载按钮? –