2012-09-19 35 views
0

我的web應用程序通過將JSON數據 發佈到某些URL(不使用html表單)與服務器端(ASP.NET MVC 3)進行交互。通過JSON模型上傳ASP.NET MVC 3文件

如何將文件發佈到服務器並使用JSON將其綁定到HttpPostedFileBase而不使用多部分表單?

謝謝!

+1

據我所知,你不能讓你發佈文件,除非你使用多部分表單。 – Liam

+0

我可以將文件作爲二進制字符串發佈爲模型屬性之一... – Dmitrii

+0

您如何訪問文件?你如何將文件轉換爲二進制文件? JavaScript沒有本地文件訪問權限。 – Liam

回答

0

這是可以做到的,但你將有跨瀏覽器的問題,更多的細節,你可以在這裏找到:How can I upload files asynchronously with jQuery?或只是谷歌「AJAX文件上傳」

+0

IE是什麼,70%的市場份額,如果IE不支持,有什麼意義? – Liam

+0

@Liam一切都取決於項目,他也可以檢查支持,如果沒有正常提交。 – webdeveloper

1

我已經這樣做了,但沒有使用HttpPostedFileBase獲得來自MVC應用程序的內容。我只是使用JSON。

您可以簡單地使用FileReader.onload(在HTML5上)方法來提取文件內容,並將其作爲Base64字符串直接發送到MVC控制器。 #upload-button<input type=file ...>標籤。

var file = $('#upload-button')[0].files[0]; 
    var reader = new FileReader(); 
    reader.onload = (function (f) { 
     return function (e) { 
      if (e.target.readyState == FileReader.DONE) { 
       $.ajax("FileStore/SavePicture", { 
        data: { content: e.target.result, name: f.name }, 
        type: "post", 
        contentType: "application/json" 
       }); 
      } 
     }; 
    })(file) 

從那裏,你可以使用Convert.FromBase64String方法CONVER到byte[]。這是Action內容的樣子;

string base64String = content; 
    // Get the starting point of the actual content from the base64String. 
    int start = base64String.IndexOf(",") + 1; 
    int length = base64String.Length - start; 
    contentAsString = base64String.Substring(start, length); 

    byte[] dataAsBytes = Convert.FromBase64String(contentAsString); 

可能還有其他一些方法來做到這一點。

+0

是的,我這樣做了,但還有另一個問題。實際上,我正在使用JavaScriptSerializer來反序列化JSON,並且base64字符串不會自動反序列化爲HttpPostedFileBase屬性。也許,有任何屬性可以應用於該模型的HttpPostedFileBase屬性,以便我可以自定義這個確定的反序列化過程屬性? – Dmitrii

+0

是的,也沒有爲我工作。所以我使用這種方法作爲解決方案。 –