多部分表单 - Web API

时间:2016-10-31 07:55:17

标签: c# asp.net-mvc post asp.net-web-api asp.net-web-api-routing

我有一个ASP.NET MVC项目需要一个API控制器,它将接受一个已发布的多部分表单并从<formroot> xml标记中提取数据(突出显示)

我正在努力让这项工作得到任何帮助将不胜感激

enter image description here

目前我有一个名为UploadController的控制器,这是我目前拥有的代码

public class UploadController : ApiController
{
    public async Task<HttpResponseMessage> PostFormData()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.BadRequest);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try
        {
            //Need to get the data from within the formroot tag


            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }
}

我不确定从formroot中获取数据的最佳方法,如果上述任何代码不正确,也请原谅我。

2 个答案:

答案 0 :(得分:0)

我总是使用以下解决方案:

<form action="/Home/Upload" enctype="multipart/form-data" id="upload" method="post">
      @Html.AntiForgeryToken()
      <input type="file" class="file" id="file" name="file" onchange="javascript:upload(this);" />
</form>

PS:&#34; upload()&#34; javascript函数使用jquery发布表单。

function upload(obj) {
    var p = $(obj).parent();
    if (p.get(0).tagName != 'FORM') {
        p = p.parent();
    }
    p.submit();
}

在我的控制器中,我用作模型绑定器&#34; HttpPostedFileBase&#34;。

[HttpPost]
[ValidateAntiForgeryToken]
public RedirectResult Upload(HttpPostedFileBase file)
{
    try
    {
        //physical path there you will save the file. 
        var path = @"c:\temp\filename.txt";
        file.SaveAs(path);
    }
    catch (UploadException ex)
    {

    }

    var url = "put here same url or another url";

    return RedirectResult(url);
}

答案 1 :(得分:0)

在Web API控制器中,您可以使用以下代码访问XML文件: -

HttpPostedFile xmlFile = HttpContext.Current.Request.Files[0];

如果您发布了多个文件,请将文件[0]替换为相应的计数1或2等。 现在,您可以将文件加载到XmlDocument对象中,并从中提取所需的节点,如: -

XmlDocument doc = new XmlDocument();
doc.Load(xmlFile.InputStream);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ab", "www.w3.org/2001/XMLSchema-instance");
XmlNode node = doc.SelectSingleNode("//ab:formroot", nsmgr);

然后,您可以执行节点提供的任何功能。