如何使用表单发布MVC将多个文件上传到服务器?

时间:2013-08-23 08:10:18

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

我正在开发Asp.Net MVC-4项目。在我的项目用户发布要求。帖子包含标题标签文件等。文件可能是多个,它可以是任何类型,如视频,doc(ppt,excel, pdf等),图像等。

我的问题是处理多个文件上传。现在首先我告诉你

目前我正在处理这个

我正在使用Jquery FIle Uplaod插件。通过这个插件,我按顺序将文件上传到服务器,在服务器上我用 SessionId 保存这些文件。当用户发布需求表单时,我只是用userId重命名这些文件。

我的方法的缺点

首先,我必须保存具有会话ID的文件,而不是必须使用userId重命名它们。因此,如果我将文件保存在Window Azure Blobs中,那么为了上传单个文件,我必须做2个事务。首先使用SessionId保存blob,然后使用userid重命名blob。我认为这会带来额外的处理和额外的成本。

现在我想知道是否有任何方法可以使用表单发布上传所有文件(带有单个文件的进度条[必需] )。因此,所有文件的用户需求表(标签,标题等)一起送到服务器,而不是在那种情况下,我将用户首先保存在数据库中,而不是用userId保存文件?

注意: 我无法使用guid或其他方式保存文件。文件名中需要UserId来唯一标识用户的文件。

2 个答案:

答案 0 :(得分:1)

您可以使用控制器中的以下代码上传

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files) {
  foreach (var file in files) {
    if (file.ContentLength > 0) {
      var fileName = Path.GetFileName(file.FileName);
      var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
      file.SaveAs(path);
    }
  }
  return RedirectToAction("Index");
}

更多详情here

答案 1 :(得分:0)

不确定我是否完全理解这个问题,但您可以在与文件上传相同的POST中发布您的用户详细信息模型(相同的表单?),然后在服务器上:

    [HttpPost]
    public JsonResult AddNewImage(UserModel user)
    {
        ReturnArgs r = new ReturnArgs();
        repo.AddUser(user) // add your user to DB here

        SaveImages(user.Id);
        r.Status = 200;
        r.Message = "OK!";

        return Json(r);
    }

    private void SaveImages(string userid)
    {
        for (var i = 0; i < Request.Files.Count; i++)
        {
            var file = Request.Files[i] as HttpPostedFileBase;
            string fileName = userid + "_" + i;

            // saving file to DB here, but you can do what you want with
            // the inputstream

            repo.SaveImage(fileName, file.InputStream, file.ContentType);
        }
    }