Разбор загруженного файла, затем сохранение содержимого файла в базе данных и отображение на экране (веб-страница)

1

Мне нужно добавить функцию загрузки. Компонент на странице, который позволяет загружать файл с списком фильмов и информацией о фильмах, затем отображать его на экране (веб-странице) и сохранять в базе данных.

Часть, в которой мне нужна помощь, анализирует содержимое загруженного 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; }
}
  • 0
    Что не работает? Это не сайт для людей, чтобы написать ваш код для вас. Какую конкретную проблему вы пытаетесь решить? Возможно, попробуйте разбить вопрос на более мелкие части, которые кому-то легче воспроизвести.
  • 1
    Чтобы быть ясным, я никогда не просил, чтобы кто-нибудь написал код для меня, поэтому не уверен, откуда вы это взяли, так что не нужно быть грубым. Конкретная проблема, с которой я сталкиваюсь, - это получение файла, который я уже загрузил. Парсинг данных файла из загруженного файла, например (title, releaseate, rating..etc), затем сохранение этого содержимого в базе данных и отображение его на веб-странице. Я искал и пытался использовать streamreader, но не могу понять это. Если вы можете направить или рассказать мне, как выполнить эту задачу, было бы полезно.
Показать ещё 3 комментария
Теги:
asp.net-mvc-4

2 ответа

1
Лучший ответ

Я решил свою проблему.

Итак, что я сделал, была удалена часть в функции загрузки, где я сохранял файл в папке, и использовал считыватель потока для чтения в файле в массив и разбивал каждую строку запятой, создавал новый объект фильма, а затем сохранял как показано ниже.

    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");
    } 
0

Итак, вы хотите сохранить сами данные файла в базу данных?

Если это так, попробуйте массив байтов (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.

Или вы спрашиваете что-то еще?

  • 0
    Спасибо, я пойду через это, чтобы увидеть, помогает ли это. Вы не против пройти через это? Я думаю, что пробовал что-то похожее, но не получилось, чтобы это работало достаточно хорошо. Я просто хочу проанализировать данные файла из загруженного файла, например (title, releaseate, rating..etc), затем сохранить это содержимое в базе данных и отобразить его на веб-странице. Я искал и пытался использовать Streamreader для чтения всего файла. Я думаю, что я пытаюсь сказать, могу ли я получить пример или объяснение того, как разобрать содержимое, которое мне нужно, сохранить в БД и отобразить его.
  • 0
    Какой тип файла вы загружаете? Файл .mov? .Mp4 файл? Каждый из них будет иметь свой собственный способ сохранения этих данных, и в результате вам потребуется отдельный анализатор для каждого типа файла, чтобы получить эту информацию. Так что это действительно зависит от того, какие типы файлов вы хотите обрабатывать.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню