2015-04-07 90 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