我在低内存嵌入式设备上运行ServiceStack(v3)。
外部客户端可以将大文件推送到此设备,以便在内部存储在硬盘驱动器上。
我按照this CodePlex文章中的步骤进行了操作,但只有在文件上传完成时才会调用ServiceStack中的Post()
方法。这让我相信ServiceStack正在将整个文件缓冲到内存中。
我需要能够自己处理System.IO.Stream
,并在每个块可用时处理它们,以便我可以立即将数据写入磁盘。
我该怎么做?
答案 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