我有一个内存大小为 42 MB 的大文件.我想以较少的内存消耗下载文件.
控制器代码
I have a big file of memory size 42 mb. I want to download the file with less memory consumption.
Controller Code
public ActionResult Download()
{
var filePath = "file path in server";
FileInfo file = new FileInfo(filePath);
Response.ContentType = "application/zip";
Response.AppendHeader("Content-Disposition", "attachment; filename=folder.zip");
Response.TransmitFile(file.FullName);
Response.End();
}
尝试使用 Stream
public ActionResult Download()
{
string failure = string.Empty;
Stream stream = null;
int bytesToRead = 10000;
long LengthToRead;
try
{
var path = "file path from server";
FileWebRequest fileRequest = (FileWebRequest)FileWebRequest.Create(path);
FileWebResponse fileResponse = (FileWebResponse)fileRequest.GetResponse();
if (fileRequest.ContentLength > 0)
fileResponse.ContentLength = fileRequest.ContentLength;
//Get the Stream returned from the response
stream = fileResponse.GetResponseStream();
LengthToRead = stream.Length;
//Indicate the type of data being sent
Response.ContentType = "application/octet-stream";
//Name the file
Response.AddHeader("Content-Disposition", "attachment; filename=SolutionWizardDesktopClient.zip");
Response.AddHeader("Content-Length", fileResponse.ContentLength.ToString());
int length;
do
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
byte[] buffer = new Byte[bytesToRead];
// Read data into the buffer.
length = stream.Read(buffer, 0, bytesToRead);
// and write it out to the response's output stream
Response.OutputStream.Write(buffer, 0, length);
// Flush the data
Response.Flush();
//Clear the buffer
LengthToRead = LengthToRead - length;
}
else
{
// cancel the download if client has disconnected
LengthToRead = -1;
}
} while (LengthToRead > 0); //Repeat until no data is read
}
finally
{
if (stream != null)
{
//Close the input stream
stream.Close();
}
Response.End();
Response.Close();
}
return View("Failed");
}
由于文件的大小,它正在消耗更多的内存,从而导致性能问题.
检查 iis 日志后,下载过程分别占用 42 mb 和 64 mb.
提前致谢
due to size of the file, it is consumpting more memory which leads to performance issue.
After checking in iis log, the download process is taking 42 mb and 64 mb each respectively.
Thanks in advance
更好的选择是使用 FileResult 而不是 ActionResult:
A better option would be to use FileResult instead of ActionResult:
使用此方法意味着您不必在服务之前将文件/字节加载到内存中.
Using this method means you don't have to load the file/bytes in memory before serving.
public FileResult Download()
{
var filePath = "file path in server";
return new FilePathResult(Server.MapPath(filePath), "application/zip");
}
对于较大的文件 FilePathResult 也会失败.
For larger files FilePathResult will also fail.
你最好的选择可能是 Response.TransmitFile()
然后.我在较大的文件 (GB) 上使用过它,之前没有遇到任何问题
Your best bet is probably Response.TransmitFile()
then. I've used this on larger files (GBs) and had no issues before
public ActionResult Download()
{
var filePath = @"file path from server";
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "filename=" + filePath);
Response.TransmitFile(filePath);
Response.End();
return Index();
}
来自 MSDN:
将指定文件直接写入HTTP响应输出流,无需在内存中缓冲.
Writes the specified file directly to an HTTP response output stream, without buffering it in memory.
这篇关于C#从服务器下载大文件,内存消耗更少的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!