我正在开发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来唯一标识用户的文件。
答案 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);
}
}