使用 HttpWebRequest 上传大文件(AllowWriteSteamBuffering 不能解决这个问题)
本文关键字:解决 不能 问题 AllowWriteSteamBuffering HttpWebRequest 文件 使用 | 更新日期: 2023-09-27 18:31:33
我的问题是:我目前正在广泛测试我的应用程序,现在我知道它无法处理大文件的上传。当然,我告诉自己这个问题,并且AllowWriteStreamBuffering
-Property已经设置为false,但是当我尝试上传大小为~700 Mb的文件时,我的PC冻结了(我有4 Gb RAM,但我没有得到MemoryOutOfRangeException
)。我既不能使用 HttpClient
-Class,因为我必须提供对 .NET Framework 4 的支持,也不能对上传进行分块,因为目标服务器不支持这种上传。我认为内存问题是由于我已经发送的数据(上传时)仍在RAM中分配。这些代码行负责:
while ((bytesRead = fileStream.Read(fileBuffer, 0, fileBuffer.Length)) != 0)
{
requestStream.Write(fileBuffer, 0, (int)bytesRead);
}
如何删除已发送但仍使用内存的数据?如果这不是问题的原因,那么我该如何解决呢?
我尝试了几种方法,并且一种内部分块上传(但HttpWebRequest
的Chunked
属性是false
)工作:
long bytesRead = 0;
long splitBytes = 1000000; // ≈ 1 Mb
int dataPacks = (int)Math.Ceiling((double)file.FileSize/splitBytes);
FileStream fileStream = new FileStream(file.Path, FileMode.Open, FileAccess.Read);
byte[] fileBuffer = new byte[splitBytes];
Stream requestStream = request.GetRequestStream();
requestStream.Write(postBuffer, 0, postBuffer.Length);
while (fileStream.Read(fileBuffer, 0, fileBuffer.Length) != 0)
{
if (bytesRead + splitBytes <= file.FileSize)
{
requestStream.Write(fileBuffer, 0, fileBuffer.Length);
fileStream.Flush();
bytesRead += splitBytes;
}
else
{
requestStream.Write(fileBuffer, 0, (int)(file.FileSize - bytesRead));
fileStream.Flush();
bytesRead += (file.FileSize - bytesRead);
}
}
它甚至可以在不接受实分块上传的服务器上工作。