2013-04-02 2 views
4

В бизнес-приложении, которое я создаю, мы разрешаем нашим администраторам загружать CSV-файл с определенными данными, которые анализируются и вводятся в наши базы данных (происходит вся соответствующая обработка ошибок и т. Д.).Загрузка файла: MemoryStream против файловой системы

В рамках обновления до .NET 4.5 мне пришлось обновить некоторые аспекты этого кода, и, пока я это делал, я столкнулся с this answer тем, кто использует MemoryStream для обработки загруженных файлов, в отличие от временно сохраняя файловую систему. Нет никакой реальной причины для меня (и, может быть, это даже плохо), но я хотел дать ему шанс немного научиться. Таким образом, я быстро выгружена этот код (от сильно типизированных модели за счет загрузки других метаданных):

HttpPostedFileBase file = model.File; 
var fileName = Path.GetFileName(file.FileName); 
var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"), fileName); 
file.SaveAs(path); 

CsvParser csvParser = new CsvParser(); 
Product product = csvParser.Parse(path); 

this.repository.Insert(product); 
this.repository.Save(); 

return View("Details", product); 

к этому:

using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    model.File.InputStream.CopyTo(memoryStream); 

    CsvParser csvParser = new CsvParser(); 
    Product product = csvParser.Parse(memoryStream); 

    this.repository.Insert(product); 
    this.repository.Save(); 

    return View("Details", product); 
} 

К сожалению, вещи ломаются, когда я это делаю - все мои данные выводятся с нулевыми значениями, и кажется, что в MemoryStream нет ничего действительно (хотя я не уверен в этом). Я знаю, что это может быть длинный выстрел, но есть ли что-то очевидное, что я здесь отсутствует или что-то могу сделать, чтобы лучше отладить это?

ответ

5

Вам нужно добавить следующее:

model.File.InputStream.CopyTo(memoryStream); 
memoryStream.Position = 0; 

... 

Product product = csvParser.Parse(memoryStream); 

При копировании файла в MemoryStream, указатель перемещается в конец потока, поэтому, когда вы попробуете прочитать его, вы получая нулевой байт вместо данных вашего потока. Вам просто нужно сбросить позицию до начала, то есть 0.

+0

правильный ответ, избили меня на несколько секунд :) –

1

Проблема в том, что ваша памятьStream имеет свою позицию, установленную до конца, и я предполагаю, что ваш CSVParser обрабатывает только с того момента, нет данных.

Чтобы исправить это, вы можете просто установить для позиции memoryStream значение 0, прежде чем вы проанализируете его с помощью csvParser.

memoryStream.Position = 0; 
Смежные вопросы