Я читаю этот отвечать, чтобы загрузить файл с помощью MVC. У меня уже есть файл после InputStream.Read
, но я не знаю, как его использовать для создания IEnumerable<MyModel>
, поэтому я могу отправить его в базу данных с помощью EF. Это файл CSV, структуру которого я знаю.
public class MyViewModel
{
[Required]
public HttpPostedFileBase File { get; set; }
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
byte[] uploadedFile = new byte[model.File.InputStream.Length];
model.File.InputStream.Read(uploadedFile, 0, uploadedFile.Length);
// now you could pass the byte array to your model and store wherever
// you intended to store it
return Content("Thanks for uploading the file");
}
Моя модель:
public class PriceViewModel
{
public int PriceId { get; set; }
public int? YearSelected { get; set; }
public int? WeekSelected { get; set; }
public int? StateSelected { get; set; }
}
@AkashKC Вот в чем вопрос. Как я это делаю? Файл представляет собой csv, я знаю структуру, поэтому я думаю, что процесс проверки, предшествующий назначению модели, было бы неплохо добавить, чтобы убедиться, что файл имеет правильную структуру.
Не могли бы вы поделиться своей моделью EF, чтобы мы знали о IEnumerable <MyModel>
@AkashKC Готово
Преобразуйте байты в строку, а затем проанализируйте CSV в моделях. Оттуда вы можете проверить данные и сохранить в базе данных. CsvHelper должен в этом сильно помочь
@Nkosi Как преобразовать байты в строку? Я знаю, как разбирать строку и все остальное.
Преобразуйте байты в строку
var csv = Encoding.UTF8.GetString(uploadedFile);
а затем проанализируйте CSV в моделях.
CsvHelper должен в этом сильно помочь.
var textReader = new StringReader(csv);
var helper = new CsvHelper(textReader);
IEnumerable<PriceViewModel> records = helper.GetRecords<PriceViewModel>();
Оттуда вы можете проверить данные и сохранить в базе данных.
Хорошо, я пробую это. Но тогда почему по другому вопросу он делает model.File.InputStream.Read
Они копируют байты из потока в массив
Хорошо, у меня что-то есть на веревочке. Но мой текст содержит испанские слова, а вместо них буквы с ударением появляются со странными знаками. Я повредил данные во время загрузки или конвертации?
Но File
является частью MyViewModel
, а не массивом
Вы создали здесь массив byte[] uploadedFile = new byte[model.File.InputStream.Length];
, а затем скопировали данные из потока в этот массив.
Хорошо, я вижу. Обычно метод влияет на объекты, но в этом случае влияют на параметры?
Для чтения акцентных слов необходимо использовать Encoding.Default. И не мог использовать GetRecords (), потому что не мог соответствовать моей модели, поэтому я просто читал по позиции.
какова цель IEnumerable <MyModel>? Вы можете напрямую назначить байтовый массив в своем модельном потоке.