我最近开始为客户开发多文件上传HTTP页面。
他希望在HTTP,Javascript和HTML中使用它,需要能够传输大文件(每个最多800兆字节),并且他还想要上传的进度条。 Flash或Silverlight不是可接受的选项,最后,也不接受第三方组件,因为需要严格的可定制性,而不需要太多麻烦。
现在,我得到了整个概念。你有一个主页有一个iframe
(ewww,我说的是i-word - 我知道)。此iframe
指向form
,其中包含文件上传。这样,提交此form
后,访问者所在的原始页面将不会重新加载,允许原始页面运行某些AJAX,不断询问传输的进度。
我首先开始在MVC中获取文件,方法是直接将其声明为action方法的参数,如下所示。
public ActionResult UploadFile(HttpPostedFile upload) {
...
}
但是MVC给我的帮助就是这个,InputStream
属性或SaveAs(...)
变量上的upload
方法都没有帮助我。
很快我发现.NET 4.0中引入了一个名为HttpRequest.GetBufferedInputStream()
的方法。这种方法特别允许我接收文件流并以增量和异步方式读取它。
我覆盖了控制器的BeginExecute
方法,并在触发特定网址时将读取功能放在那里,就像这样。
protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
{
if (requestContext.HttpContext.Request.Url.AbsolutePath.StartsWith("/Home/UploadFile"))
{
//we're doing a file upload
var streamSource = requestContext.HttpContext.Request.GetBufferedInputStream();
//read from stream, write to file
}
}
这一切都很好......当AJAX没有进入并中断时。你看,如果我运行了我的AJAX脚本(在iframe
上传开始后10秒执行),那么(当它发出GET
请求时)该请求会中断正在读取文件的流,即使它处于不同的动作,即使是在不同的控制器上。
我收到的错误如下:
客户端已断开连接,因为基础请求已完成。不再提供HttpContext。
我该怎么办?
答案 0 :(得分:1)
看看ASP .NET Ajax File Upload。这应该说明GetBufferlessInputStream和GetBufferedInputStream如何工作以及如何使用它们进行“ajax”文件上传,但会强制您更改大量代码。
如果您使用的是.NET 4.5,那么使用GetBufferedInputStream的项目的更新版本将很快出现,并且易于使用。您可以查看相同的链接以获取更新。