【问题标题】:Parse uploaded file, then save file contents to database and display to screen(webpage)解析上传的文件,然后将文件内容保存到数据库并显示到屏幕(网页)
【发布时间】:2014-06-24 01:35:28
【问题描述】:

我需要添加一个上传功能。页面上的一个组件,允许您上传包含电影列表和电影信息的文件,然后将其显示到屏幕(网页)并保存到数据库。

我需要帮助的部分是解析上传的 csv 文件的内容并将数据保存到 sql server 数据库并将内容列表显示到屏幕上。我已经创建了上传功能,如下所示:

这是一个 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; }
}

【问题讨论】:

  • 什么不起作用?这不是一个供人们为您编写代码的网站。您遇到并试图解决的具体问题是什么?也许可以尝试将问题分解成更小的部分,以便人们更容易重现。
  • 需要说明的是,我从来没有要求任何人为我编写代码,所以不确定你从哪里得到的,所以没必要粗鲁。我遇到的具体问题是获取我已经上传的文件。从上传的文件中解析文件数据,例如(标题、发布日期、评级..等),然后将这些内容保存到数据库并将其显示到网页上。我已经搜索并尝试使用流式阅读器,但似乎无法弄清楚。如果您能指导或指导我完成这项任务,将会很有帮助。
  • 我的本意是不要显得粗鲁。就目前的形式而言,这个问题相当大。解析文件,将其保存到数据库并显示它跨越了许多技术。只是不清楚你在问什么。例如,为什么不能保存文件?你有错误吗?如果不是,那有什么问题?其他问题也一样。每个步骤都不起作用怎么办?
  • 不用担心。我正在尝试学习asp.net mvc 4。所以我想添加一个上传功能。上面我上传的功能工作得很好。现在我正在努力解决如何获取上传的文件并从中读取数据。我可以将上传的文件保存到我的应用程序的文件夹中。现在我想检索上传的文件以读取/解析内容,如(标题、发布日期、评级..等)并将其显示到屏幕并存储在数据库中。
  • 我试过用 streamreader 读取整个文件,然后我不知道之后该怎么做。

标签: c# asp.net asp.net-mvc-4


【解决方案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");
    } 

【讨论】:

    【解决方案2】:

    所以你想将文件数据本身保存到数据库中?

    如果是这样,请为模型中的数据类型尝试字节数组 (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 语句。

    或者你在问别的什么?

    【讨论】:

    • 谢谢,我会检查一下是否有帮助。你介意带我去看看吗?我相信我已经尝试过类似的东西,但并没有让它很好地工作。我只想从上传的文件中解析文件数据,例如(标题、发布日期、评级..等),然后将这些内容保存到数据库并将其显示到网页上。我已经搜索并尝试使用 Streamreader 读取整个文件。我想我想说的是,如果我能得到一个例子或解释如何解析我需要的内容并保存到数据库并显示它。
    • 您要上传什么类型的文件? .mov 文件? .mp4 文件?每个文件都有自己的保存数据的方式,因此,您需要为每种文件类型使用不同的解析器来获取该信息。所以这真的取决于你想处理什么类型的文件。
    • 我正在上传一个 csv 文件
    • CSV 文件有多简单?我会研究某种CSV阅读器。或者看到这个:stackoverflow.com/questions/1375410/…
    • 它的文件非常简单。它只有每部电影的电影列表(标题、发行日期和评级)。就是这样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2020-01-28
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多