Мне нужно добавить функцию загрузки. Компонент на странице, который позволяет загружать файл с списком фильмов и информацией о фильмах, затем отображать его на экране (веб-странице) и сохранять в базе данных.
Часть, в которой мне нужна помощь, анализирует содержимое загруженного CSV файла и сохраняет данные в базе данных sql-сервера и отображает список содержимого на экран. Я уже создал функцию загрузки, как показано ниже:
Это приложение для просмотра ASP.NET MVC 4.
Ниже приводится то, что у меня есть до сих пор:
Посмотреть:
@using (Html.BeginForm("Upload", "Movies", FormMethod.Post, new {enctype="multipart/form-data"}))
{
<input type="file" name="File" id="File" />
<input type="submit" name="Submit" value="Upload" />
<span>@ViewBag.Message</span>
}
контроллер:
[HttpPost]
public ActionResult Upload(HttpPostedFileBase File )
{
// Verify that the user selected a file
if (File != null && File.ContentLength > 0)
{
// extract only the filename
var fileName = Path.GetFileName(File.FileName);
// store the file inside ~/App_Data/uploads folder
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
File.SaveAs(path);
ViewBag.Message = "File uploaded successfully";
}
// redirect back to the index action to show the form once again
return RedirectToAction("Index");
}
Модель (база данных):
public class Movie
{
public int ID { get; set; }
[Required]
public string Title { get; set; }
//[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Required]
public string Genre { get; set; }
[Range(1,100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }
public bool IsCompleted { get; set; }
[StringLength(5)]
public string Rating { get; set; }
public string EnterUrl { get; set; }
//public HttpPostedFileBase Document { get; set; }
}
public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
}
Я решил свою проблему.
Итак, что я сделал, была удалена часть в функции загрузки, где я сохранял файл в папке, и использовал считыватель потока для чтения в файле в массив и разбивал каждую строку запятой, создавал новый объект фильма, а затем сохранял как показано ниже.
public ActionResult Upload(HttpPostedFileBase File )
{
// Verify that the user selected a file
if (File != null && File.ContentLength > 0)
{
StreamReader csvReader = new StreamReader(File.InputStream);
{
string inputLine = "";
while ((inputLine = csvReader.ReadLine()) != null)
{
string[] values = inputLine.Split(new Char[] { ',' });
Movie movie = new Movie();
movie.Title = values[0];
movie.ReleaseDate = DateTime.Parse(values[1]);
movie.Genre = values[2];
movie.Price = Decimal.Parse(values[3]);
db.Movies.Add(movie);
db.SaveChanges();
}
csvReader.Close();
}
}
// redirect back to the index action to show the form once again
return RedirectToAction("Index");
}
Итак, вы хотите сохранить сами данные файла в базу данных?
Если это так, попробуйте массив байтов (byte []) для типа данных в вашей модели. Я уверен, что инфраструктура сущности сохранит ее как varbinary (max).
Поэтому вместо:
//public HttpPostedFileBase Document { get; set; }
Установите для этого значение:
public byte[] Document { get; set; }
Затем, чтобы получить HttpPostedFile в массив байтов:
byte[] data;
using (Stream inputStream = model.File.InputStream)
{
MemoryStream memoryStream = inputStream as MemoryStream;
if (memoryStream == null)
{
memoryStream = new MemoryStream();
inputStream.CopyTo(memoryStream);
}
data = memoryStream.ToArray();
}
Затем перестройте и повторите попытку. Не забудьте использовать инструкцию using.
Или вы спрашиваете что-то еще?