多个异步文件上传以及分块到ASP.Net Web API

鲍勃

我已经阅读了许多密切相关的问题,但没有一个恰好能解决这个问题。如果重复,请给我一个链接。

我正在使用flowjs库的有角度版本进行HTML5文件上传(https://github.com/flowjs/ng-flow)。这非常有效,我能够以1MB的块同时上传多个文件。有一个ASP.Net Web API文件控制器,可以接受这些文件并将它们保存在磁盘上。尽管我可以做这项工作,但我没有有效地做,并且想知道一种更好的方法。

首先,我在异步方法中使用了MultipartFormDataStreamProvider,只要将文件上传到单个块中,该方法就可以很好地工作。然后我切换到仅使用FileStream将文件写入磁盘。只要块按顺序到达,这也可以工作,但是,当然,我不能依靠它。

接下来,为了看到它的工作原理,我将这些块写入了各个文件流,并在事后将它们组合在一起,因此效率低下。上传完成后,一个1GB的文件将生成一千个需要读取和重写的块。我可以将所有文件块都保存在内存中,并在它们全部上传后刷新它们,但恐怕服务器会崩溃。

似乎应该有一个很好的异步解决方案来解决这个难题,但我不知道它是什么。一种可能是在写入当前块时使用async/await组合先前的块。另一种可能是使用Begin/EndInvoke创建一个单独的线程,以便磁盘上的文件操作独立于从读取的线程进行处理,HttpContext但这将依赖于ThreadPool并且我担心当我的MVC控制器创建的线程会被不适当地终止。返回。我可以创建一个FileWatcher完全独立于ASP.Net的程序,但这非常麻烦。

所以我的问题是,1)我已经缺少一个简单的解决方案了吗?(似乎应该有)和2)如果没有,那么在Web API框架内解决此问题的最佳方法是什么?

谢谢,鲍勃

斯蒂芬·克莱里(Stephen Cleary)

我不熟悉这种分块上传,但是我认为这应该可行:

  • 使用flowTotalSize预先分配的文件,当第一块用武之地。
  • SemaphoreSlim每个文件有一个序列化该文件的异步写入。
  • 每个块将写入flowChunkSize * (flowChunkNumber - 1)文件中自己的偏移量)。

这无法处理上传意外终止的情况。这种解决方案通常涉及分配/写入临时文件(具有特殊扩展名),然后在最后一个块到达时移动/重新命名该文件。

不要忘记确保文件写入实际上是异步的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章