2015-04-07 69 views
9

我在制作复杂的表单并且我想使用多个(不同的)dropzone.js来上传文件。dropzone多个区域的形式相同

这是我如何做:

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
... form elements... 
<div id="files" name="files" class="dropzone"></div> 
} 

而且JS:

Dropzone.options.files = { 
    autoProcessQueue: false, 
    uploadMultiple: true, 
    parallelUploads: 100, 
    maxFiles: 100, 

    paramName: "file", // The name that will be used to transfer the file 
    maxFilesize: 8, // MB 
    url: "/pathToAction" 
}; 

我想在同一时间发送形式的文件和数据,都映射到一个对象到控制器,但dropzone需要有“网址”才能接受文件上传......如何解决这个问题?也许我可以得到表单元素的URL并将其放入url参数中?

+1

我处理的方式这种情况下,是通过设置在我的控制器,本地保存他们上传的所有文件上传方法。然后,当用户提交表单时,我只是把这些文件保存在需要保存的地方。这种方式当然有一些JavaScript处理,当一个文件被删除,我不得不为我的文件持有一些鉴别器,但它是适用于所有类型的文件,是坚实的。如果你对这种方式感兴趣,我可以提供这个代码,所以让我知道... –

回答

-2

您的创建与@ Url.Action帮手

... 
    paramName: "file", // The name that will be used to transfer the file 
    maxFilesize: 8, // MB 
    url: "@Url.Action("actionname")" 
}; 
3

正如我搜索在谷歌的行动路径,有没有办法发送多个“悬浮窗”一个请求以相同的URL,所以我通过以下步骤手动解决了此问题:

1)Dropzone实际上将图像更改为Base64字符串以进行缩略图预览,然后将该字符串添加到“img”标记的源。所以,你需要读出的图像“SRC”和“ALT”,并把它们添加到动态隐藏的下面输入类型:

$('#btnUpload').on('click', function() { 
     $.each($("img[data-dz-thumbnail]"), function(index, value) { 
      $('<input>').attr({ 
       type: 'hidden', 
       name: 'myHiddenFiles[' + index + '].Key', 
       value: $(value).attr("alt") 
      }).appendTo('#newsForm'); 

      $('<input>').attr({ 
       type: 'hidden', 
       name: 'myHiddenFiles[' + index + '].Value', 
       value: $(value).attr("src") 
      }).appendTo('#upload-Invoices'); 
     }); 
     $("#upload-Invoices").submit(); 
    }); 

重复此代码对每个悬浮窗您需要发布自己的数据。

2)在您的操作方法中,您需要添加一个类型为“Dictionary”的参数,以便以Base64字符串格式获取文件名和文件内容。 然后,您可以将Base64字符串解析为图像,将其存储为文件并将表单数据保存到数据库。 你可以看到相关的代码片段如下:

 [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(ModelClass model, IDictionary<string, string> myHiddenFiles) 
     { 
      if (ModelState.IsValid) 
      { 
       foreach (var file in myHiddenFiles) 
       { 
        var base64 = file.Value.Substring(file.Value.IndexOf(',') + 1).Trim('\0'); 
        var bytes = Convert.FromBase64String(base64); 

        var saveFile = Server.MapPath("~/Images/" + file.Key); 
        System.IO.File.WriteAllBytes(saveFile, bytes); 

        // Save your model to database.... 
       } 
      } 
      return View(); 
     } 
+1

这只适用于图像,如果我没有弄错。 –

+0

这对我来说是个问题! – clement