ServiceStack使用块/缓冲区上传大文件

时间:2014-04-14 21:18:00

标签: file-upload servicestack

我在低内存嵌入式设备上运行ServiceStack(v3)。

外部客户端可以将大文件推送到此设备,以便在内部存储在硬盘驱动器上。

我按照this CodePlex文章中的步骤进行了操作,但只有在文件上传完成时才会调用ServiceStack中的Post()方法。这让我相信ServiceStack正在将整个文件缓冲到内存中。

我需要能够自己处理System.IO.Stream,并在每个块可用时处理它们,以便我可以立即将数据写入磁盘。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

您没有声明您使用的是Mono,但我假设您将使用嵌入式设备。您遇到的问题是由HttpRequest.Mono.cs引起的。 multipart/form-data(这是大多数javascript文件上传库使用的)会被此类自动提取到内存流中,并可通过Request.Files获得。通常这很棒,并且使上传文件变得非常简单。当您想要上传大量内容时会出现问题。

如果您阅读this StackOverflow响应和this CodeProject文章,您将被指示使用IRequiresRequestStream自己控制DTO反序列化所以我启动了ServiceStack服务和AngularJS客户端测试它。 Here is my first pass at the solution

不幸的是,它没有按预期工作。消息部分仍然被反序列化为Request.Files MemoryStream。这是因为multipart/form-data仍然在HttpRequest.Mono的请求处理链中被截获并处理得很低。

进一步的研究表明multipart/form-data协议对小文件很有用,但as mythz himself points out这对于上传大量数据从未真正意义重大。有更好的方法可以进行大型文件上传...

我对此问题的建议解决方案是使用IRequiresRequestStream,但远离multipart/form-data,只是直接将二进制数据作为原始类型(Content-Type: image/jpeg)上传。)你'我必须对文件进行自己的分块和重新组合,但是您将完全控制该过程,并且您将全部设置为处理任何大小的上传。 Here is the final sample code