在哪里使用 GetBufferlessInputStream?
Posted
技术标签:
【中文标题】在哪里使用 GetBufferlessInputStream?【英文标题】:Where to use GetBufferlessInputStream? 【发布时间】:2018-07-23 04:32:04 【问题描述】:在哪里设置 HttpContext.Request.GetBufferlessInputStream(true)?我试图允许用户上传大于 2GB 的文件,显然我遇到了“maxRequestLength”int 类型限制。我尝试通过以下方式创建 StreamReader:
var reader = new StreamReader(HttpContext.Request.GetBufferlessInputStream(true));
但我在控制器中执行此操作,最终得到以下错误:
“在调用 HttpRequest.Form、Files、InputStream 或 BinaryRead 后,不支持此方法或属性。”
所以我猜我必须在调用控制器方法之前进行此更改。我搜索了堆栈溢出和许多其他网站的答案,但我发现的只是如何使用它而不是在哪里使用它。
感谢您抽出宝贵时间帮助我解决这个问题。
【问题讨论】:
【参考方案1】:您将不得不在 HttpModule 中实现您的逻辑 - 看到这个类似的问题:How should I use HttpRequest.GetBufferlessInputStream?
更新 - 实际上你最好编写自己的 HttpHandler 而不是模块
使用 GetBufferlessInputStream 基本上是在告诉 ASP.NET 您将处理整个请求,而不是只处理其中的一部分。正如您在模块中使用它时所看到的,在您的模块完成后,请求将继续通过请求管道的其余部分,并且 ASP.NET 预计能够读取部分输入。
通过编写自己的 HttpHandler,您将负责整个处理过程 - 因此这仅用于处理大型上传。
我找到了一个链接,其中包含一个看起来与您非常相关的示例https://blogs.visoftinc.com/2013/03/26/streaming-large-files-asynchronously-using-net-4-5/
【讨论】:
酷。谢谢(你的)信息。我创建了一个 HttpModule,但现在我在这里概述了一个不同的问题:***.com/questions/48776028/… 你可以帮我解决这个问题吗? 效果很好。谢谢。但现在我有一个不同的问题。我将如何提取我发布的文件以便保存它。我不想将它写入文本文件,所以 StreamWriter 不是我想要使用的。在此之前,我只是将文件附加到 Jquery 中的 formdata 中,就像这个问题的第一个答案一样:link 然后我在我的控制器中接受它作为 HttpPostedFileBase。 我在这里读过 link 'BinaryRead()'、'Form'、'Files' 和 'InputStream' 不会与 'GetBufferlessInputStream()' 合作,所以我很友善丢失了如何从请求中提取文件以便我可以保存它。谢谢! 您将从 GetBufferlessInputStream 获得一个 Stream 对象 - 该流代表上传的文件。根据文件的内容类型,您需要决定如何编写它。如果它只是一个大文本文件,您应该能够创建一个 StreamWriter 并将其传递给 Stream。如果它是一个大的二进制文件,你应该创建一个 BinaryWriter 并将它传递给 Stream。 所以该文件是一个 .db 文件,所以我会使用 StreamWriter,但执行类似于 this 的操作不起作用,因为 2GB 对于 int.MaxValue 来说太大了。我尝试创建类似于this 的扩展方法,但 MemoryStream 的容量是 Int 类型......以上是关于在哪里使用 GetBufferlessInputStream?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里使用 GetBufferlessInputStream?