2014-11-23 124 views
0

我的問題如下: 我目前正在廣泛測試我的應用程序,現在我知道它無法處理上傳的大文件。當然,我告訴自己這個問題,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); 
} 

如何刪除這已經發送,但是仍然使用我的內存中的數據? 如果這不是問題的原因,那我該如何解決呢?

回答

0

我嘗試了幾種方法,以及一種內部分塊上傳(但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); 
       } 
      } 

它的工作原理,甚至對不接受現實服務器分塊上傳。