我需要添加上传功能。页面上的一个组件,允许您上传包含电影列表和电影信息的文件,然后将其显示到屏幕(网页)并保存到数据库。
我需要帮助的部分是解析上传的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; }
}
答案 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语句。
或者你在问别的什么?