2012-05-23 3 views
1

я получаю следующее сообщение об ошибке, когда я загружать файлы размером более 500 Мб«System.OutOfMemoryException» при загрузке большого файла

«Exception типа„System.OutOfMemoryException“был брошен.»

Мой код ниже:

public readonly string Filename, ContentType; 
public readonly int Size; 
public readonly byte[] Bytes; 

public FileHolder(HttpPostedFile file) 
{ 
      Filename = Path.GetFileName(file.FileName); 
      ContentType = GetContentType(file.ContentType, Filename); 
      Size = file.ContentLength; 
      Bytes = new byte[file.InputStream.Length];   //Here i get error 
      file.InputStream.Read(Bytes, 0, Size); 
} 
+3

Проще говоря, вы создаете массив байт, который слишком велик для вашей машины для обработки в памяти. – Doomsknight

+0

Каково значение file.InputStream.Length? –

+0

Dupe of http://stackoverflow.com/questions/525894/is-there-any-memory-restrictions-on-an-asp-net-application –

ответ

0

Вы не должны загружать весь файл в массив байтов. Вместо этого вы можете обрабатывать файл непосредственно из входного потока.

4

Не пытайтесь читать весь поток сразу. В любом случае, вы не получите весь поток.

Создать буфер разумного размера, а затем прочитать блок в то время:

byte[] buffer = new byte[8192]; 
int offset = 0; 
int left = Size; 
while (left > 0) { 
    int len = file.InputStream.Read(buffer, 0, Math.Min(buffer.Length, left)); 
    left -= len; 
    // here you should store the first "len" bytes of the buffer 
    offset += len; 
} 
+0

Я думаю, что некоторые [псевдо-код] отсутствует в «хранилище ... байтов». (Кроме того, есть ли особая причина для 'offset'?) –

+0

@pst: Я уточнил комментарий. Переменная 'offset' здесь не используется кодом, но может потребоваться код, который должен хранить данные. – Guffa

+0

@Guffa: как я могу хранить байты в вашем коде? Не могли бы вы указать его? – ravidev

Смежные вопросы