2017-06-13 98 views
0

我有一個非常簡單的視圖,它將提示用戶選擇一個JSON文件,然後解析它。如何將文件路徑返回給控制器來解析JSON文件

這裏是從視圖中的相關代碼...

@using (Html.BeginForm("AddSampleDataJSON", "Event")) 
{ 
    <input type="file" name="GetJSONFile" /><br> 
    <input type="submit" /> 
} 

這裏是從控制器的方法:

[HttpPost] 
    public ActionResult AddSampleDataJSON(FormCollection form) 
    { 
     string path = ?? 
     using (StreamReader r = new StreamReader(path)) 
     { 
      string json = r.ReadToEnd(); 
      List<Event> events = 
      JsonConvert.DeserializeObject<List<Event>>(json); 
     } 
     return View(); 
    } 

接下來的問題是如何訪問的完整路徑,所以我可以發送到StreamReader最終解析JSON。我在FormCollection對象中看不到它。

+2

由於安全原因(瀏覽器僅發送文件名並且不公開使用文件系統),您不能這麼做。你的參數需要是'HttpPostedFileBase GetJSONFile',它將被填充文件內容。你需要在窗體標籤 –

+0

中設置'enctype =「multipart/form-data」'屬性作爲進入該方法的參數?即使在添加了該屬性後,它仍爲空。而我選擇的文件確實是一個JSON文件。 – user1327418

+0

然後你沒有正確設置它。 (並且它沒有區別它是什麼類型的文件) –

回答

2

您將無法訪問該文件的客戶端路徑。你只會看到文件名。

您應該編碼設置爲multipart/form-data在您的視圖:

@using (Html.BeginForm("AddSampleDataJSON", "Event", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="uploadedFile" /><br> 
    <input type="submit" /> 
} 

而在你的控制器的輸入參數更改爲HttpPostedFileBase,與參數名稱是一樣的形式name參數:

[HttpPost] 
public ActionResult AddSampleDataJSON(HttpPostedFileBase uploadedFile) 
{ 
    using (StreamReader r = new StreamReader(uploadedFile.InputStream)) 
    { 
     string json = r.ReadToEnd(); 
     List<Event> events = JsonConvert.DeserializeObject<List<Event>>(json); 
    } 

    return View(); 
} 
+0

優秀,工作! – user1327418