如何将文件路径返回给控制器来解析JSON文件

问题描述:

我有一个非常简单的视图,它将提示用户选择一个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

然后你没有正确设置它。 (并且它没有区别它是什么类型的文件) –

您将无法访问该文件的客户端路径。你只会看到文件名。

您应该编码设置为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