- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试通过 Controller ActionResult 返回大文件,并实现了如下所示的自定义 FileResult 类。
public class StreamedFileResult : FileResult
{
private string _FilePath;
public StreamedFileResult(string filePath, string contentType)
: base(contentType)
{
_FilePath = filePath;
}
protected override void WriteFile(System.Web.HttpResponseBase response)
{
using (FileStream fs = new FileStream(_FilePath, FileMode.Open, FileAccess.Read))
{
int bufferLength = 65536;
byte[] buffer = new byte[bufferLength];
int bytesRead = 0;
while (true)
{
bytesRead = fs.Read(buffer, 0, bufferLength);
if (bytesRead == 0)
{
break;
}
response.OutputStream.Write(buffer, 0, bytesRead);
}
}
}
}
但是我遇到的问题是整个文件似乎都被缓冲到内存中。我需要做什么来防止这种情况发生?
最佳答案
您需要刷新响应以防止缓冲。但是,如果您在不设置内容长度的情况下继续缓冲,用户将看不到任何进展。因此,为了让用户看到正确的进度,IIS 缓冲整个内容,计算内容长度,应用压缩,然后发送响应。我们采用以下程序以高性能向客户交付文件。
FileInfo path = new FileInfo(filePath);
// user will not see a progress if content-length is not specified
response.AddHeader("Content-Length", path.Length.ToString());
response.Flush();// do not add anymore headers after this...
byte[] buffer = new byte[ 4 * 1024 ]; // 4kb is a good for network chunk
using(FileStream fs = path.OpenRead()){
int count = 0;
while( (count = fs.Read(buffer,0,buffer.Length)) >0 ){
if(!response.IsClientConnected)
{
// network connection broke for some reason..
break;
}
response.OutputStream.Write(buffer,0,count);
response.Flush(); // this will prevent buffering...
}
}
您可以更改缓冲区大小,但 4kb 是理想的,因为较低级别的文件系统也以 4kb 的 block 读取缓冲区。
关于c# - FileResult 缓冲到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12464252/
有时我在调用Web服务以获取凭证且Web服务为KO时出现错误。我需要重定向到其他操作:我需要执行以下操作: public virtual FileResult Ticket(int operati
我正在尝试通过 Controller ActionResult 返回大文件,并实现了如下所示的自定义 FileResult 类。 public class StreamedFileResult
我的 View 中有一个列表,其中包含一个 ActionLink 按钮“下载”,我希望他们在单击该链接时下载一个文件。该文件位于我项目的 map 中。 查看: Your active lin
我正在使用 ASP.NET Core 2.1 ActionResult 从 Controller 返回一个文件: [HttpGet] public ActionResult Download() {
我正在研究 ASP.NET Core API。 API 是数据库驱动的。 我将图像存储在数据库中,我的 ArtistImage.cs 实体如下所示: ArtistImage.cs public cla
是否可以在 C# 中从 FileResult 获取 byte[]? 最佳答案 FileResult是一个 abstract 类,所以它不会是底层 instance 类型 - 假设正确的 overloa
我有一个返回 FileResult (这是一个 png 图像)的操作。我非常希望浏览器能够缓存结果,因为对于给定的请求 uri,它不会改变。 我使用路由使 uri 看起来像这样 - http://lo
我需要在单击某些文本时下载特定文件。我希望典型的“另存为..”对话框可以选择保存文件的位置,但它没有出现。请求和响应都正常。 请求/响应 header GET /Survey/GetSurveyFil
我正在编写 url 重定向器。现在我正在为此苦苦挣扎: 假设我有这个方法: public FileResult ImageRedirect(string url) 然后我将此字符串作为输入传递:htt
在我的 Controller 中,我有一个 ActionResult 它返回一个文件。 [HttpPost] public ActionResult ExportCSV(ReportResultVie
我有一个返回文件结果(返回 PDF 文件)的 MVC 方法,我需要在 src 标签中使用相同的 url 并在浏览器中显示它。 例如我的示例代码如下: public FileResult GetAtta
这可能很简单,但这里是: 我正在我的 MVC3 应用程序中实现一个 excel 可下载报告。我过去使用过这种方法并且效果很好,但是在这种情况下,报表中可能不存在销售数据。这是我的代码: 我在 Repo
出于模拟目的,我想将 FileResult 输出到磁盘上的实际文件。 有没有办法获取 FileResult 的内容并将其写入文件?FileResult 上公开的属性有点小。 我正在寻找类似的东西: v
我有一个返回 FileResult 的 MVC C# Controller [HttpPost] public FileResult FinaliseQuote(string quot
我有一个操作将 Excel 作为自定义 FileResult 返回。我的解决方案基于 ClosedXml库(内部使用 OpenXml)。我的 XlsxResult 类使用服务器上的只读 .xlsx 文
我有一个操作将 Excel 作为自定义 FileResult 返回。我的解决方案基于 ClosedXml库(内部使用 OpenXml)。我的 XlsxResult 类使用服务器上的只读 .xlsx 文
我一直在研究我的 ASP.NET MVC 应用程序如何记录不成功/不完整的下载。我有一个 Controller 处理当前返回 FileResult 的文件请求。我需要记录的是 IP 地址、文件名和下载
使用 AWSSDK.S3 nuget 包,我试图返回一个从 S3 存储桶中检索到的文件。我的出发点是基于此 SO answer 中给出的示例. 示例 Controller 代码: public Fil
我正在尝试使用 jQuery 动态更改图像的来源。这是我们之前所做的一个示例: $('#resultsDiv').on('mouseover', '.cardImage', function() {
我有一个按钮,可以通过在 Controller 中运行保存函数来保存表单。该 Controller 的形式如下: [HttpPost] public ActionResult Save(ViewMod
我是一名优秀的程序员,十分优秀!