使用HttpWebRequest上传大文件(AllowWriteSteamBuffering不解决此问题)
问题描述:
我的问题如下: 我目前正在广泛测试我的应用程序,现在我知道它无法处理上传的大文件。当然,我告诉自己这个问题,AllowWriteStreamBuffering
- 属性已被设置为false,但是当我尝试上传一个大小为〜700 Mb的文件时,我的PC冻结了(我有4 Gb RAM,而且我没有得到一个MemoryOutOfRangeException
)。我无法使用HttpClient
-Class,因为我必须提供对.NET Framework 4的支持,也不能将上载分块,因为目标服务器不支持这种上载。 我认为内存问题是由于我已发送的数据(上传时)仍然分配在RAM中导致的。 这些代码行负责是:使用HttpWebRequest上传大文件(AllowWriteSteamBuffering不解决此问题)
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);
}
}
它的工作原理,甚至对不接受现实服务器分块上传。