我已经阅读了许多相关问题,但没有一个完全符合这个问题。如果是重复的,请给我发送链接。
我正在使用流js库的angular版本进行HTML5文件上传 (https://github.com/flowjs/ng-flow)。这个库非常好用,我能够同时上传多个文件,每个文件以1MB为单位。有一个ASP.Net Web API文件控制器接受这些文件并将它们保存到磁盘上。虽然我可以使其工作,但我不高效,想知道更好的方法。
首先,我在异步方法中使用MultipartFormDataStreamProvider,只要文件在单个块中上传,就可以很好地工作。然后我切换到只使用FileStream将文件写入磁盘。只要块按顺序到达,这也可以工作,但当然,我不能依赖于它们的顺序。
接下来,只是为了看到它的工作原理,我将块写入单独的文件流中,并在上传完成后将它们组合起来,因此效率低下。一个1GB的文件会生成一千个需要在上传完成后读取和重新写入的块。我可以将所有文件块保存在内存中,并在全部上传后将它们刷新,但我担心服务器会崩溃。
似乎应该有一个不错的异步解决方案来解决这个问题,但我不知道是什么。一种可能性是在编写当前块时使用
我正在使用流js库的angular版本进行HTML5文件上传 (https://github.com/flowjs/ng-flow)。这个库非常好用,我能够同时上传多个文件,每个文件以1MB为单位。有一个ASP.Net Web API文件控制器接受这些文件并将它们保存到磁盘上。虽然我可以使其工作,但我不高效,想知道更好的方法。
首先,我在异步方法中使用MultipartFormDataStreamProvider,只要文件在单个块中上传,就可以很好地工作。然后我切换到只使用FileStream将文件写入磁盘。只要块按顺序到达,这也可以工作,但当然,我不能依赖于它们的顺序。
接下来,只是为了看到它的工作原理,我将块写入单独的文件流中,并在上传完成后将它们组合起来,因此效率低下。一个1GB的文件会生成一千个需要在上传完成后读取和重新写入的块。我可以将所有文件块保存在内存中,并在全部上传后将它们刷新,但我担心服务器会崩溃。
似乎应该有一个不错的异步解决方案来解决这个问题,但我不知道是什么。一种可能性是在编写当前块时使用
async
/await
来组合先前的块。另一种可能是使用Begin
/EndInvoke
创建一个单独的线程,以便磁盘上的文件操作独立于读取HttpContext
的线程处理,但这将依赖于ThreadPool
,我担心当我的MVC控制器返回时,创建的线程会被过度终止。我可以创建一个完全独立于ASP.Net的FileWatcher
,但那会非常麻烦。
所以我的问题是,1)我是否错过了已经存在的简单解决方案?(似乎应该有)2)如果没有,什么是在Web API框架内解决这个问题的最佳方法?
谢谢,Bob