2016-03-04 50 views
0

我想從一個網頁異步上傳文件的ASP.NET MVC行動:上傳文件異步地MVC.NET

[HttpPost] 
public JsonResult AnalyseFile(HttpPostedFileBase file) 
{ 
    // do stuff 
    return Json(someResultObjects); 
} 

我的問題是,當該方法在服務器上執行時,文件參數爲空。

在HTML中的土地,我有一個包含文件輸入字段:

<input type="file" accept=".xlsx" required="required" id="FileInput" name="FileInput" onchange="javascript:AnalyseFile();" /> 

而且我有一些JavaScript代碼:

function AnalyseFile() { 
    var fileInput = document.getElementById('FileInput'); 
    var file = fileInput.files[0]; 
    var url = 'http://someserver/somecontroller/AnalyseFile'; 
    var xhr = new XMLHttpRequest(); 
    xhr.upload.onreadystatechange = function() { 
    if(xhr.readyState == 4) { 
     // do stuff 
    } 
    }; 
    xhr.open('POST', url, true); 
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    xhr.send('file=' + file); 
} 

我驗證過javascript文件對象有一個通過在var file = fileInput.files [0]之後插入以下代碼行來引用文件:

alert(file.Name); 

正確顯示消息框中的文件名稱。

但是,當調用服務器端方法時,文件本身缺失(HttpPostedFileBase「文件」參數爲空)。任何人都可以告訴我我在這裏做錯了什麼?目標是讓HttpPostedFileBase具有對文件的引用,以便我可以在服務器上對它進行一些分析,並將結果發送回瀏覽器以便呈現給用戶。

+0

不應該輸入名稱是否等於HttpPostetFileBase名稱,即「文件」? – andreasnico

+0

服務器是否期待'javascript''File'對象?在'公共JsonResult AnalyseFile(HttpPostedFileBase文件)''JSONResult'表示服務器在'POST'處期待'JSON'嗎? – guest271314

+0

查看http://stackoverflow.com/questions/19042116/ajax-beginform-in-mvc-to-upload-files/ – guest271314

回答

0

可以允許介質類型頭接受「應用程序/ X WWW的形式,進行了urlencoded」服務器端。 默認格式化程序可能不支持'application/x-www-form-urlencoded', 因此文件爲空。

+0

我已經將內容類型更改爲'multipart/form-data',但確實沒有解決問題。我不確定哪個更好。 –

+0

在我正在做的項目中,我使用了自定義的Json格式器。在這我有以下代碼公共JsonNetFormatterDecide():base() { SupportedMediaTypes.Add(new System.Net.Http.Headers。MediaTypeHeaderValue( 「應用程序/ JSON」)); SupportedMediaTypes.Add(新System.Net.Http.Headers.MediaTypeHeaderValue( 「text/plain的」)); }'這是因爲我知道,我期待JSON或純文本作爲輸入,根據您的介質類型頭是什麼,你必須改變標頭值。 –