使用 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 上传大文件(AllowWriteSteamBuffering 不能解决这个问题)

我尝试了几种方法,并且一种内部分块上传(但HttpWebRequestChunked属性是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);
                }
            }

它甚至可以在不接受实分块上传的服务器上工作。

相关文章: