解析上传的文件,然后将文件内容保存到数据库并显示到屏幕(网页)

时间:2014-06-24 01:35:28

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

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

我需要帮助的部分是解析上传的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; }
}

2 个答案:

答案 0 :(得分: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");
    } 

答案 1 :(得分: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语句。

或者你在问别的什么?