多部分表单 - Web API
multipart form - Web API
我有一个 ASP.NET MVC 项目,它需要一个 API 控制器,它将接受发布的多部分表单并从 <formroot>
xml 标签中提取数据(突出显示)
我正在努力使这项工作正常进行任何帮助将不胜感激
目前我有一个名为 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 中获取数据的最佳方式,如果上面的任何代码不正确,也请原谅我。
我总是使用以下解决方案:
<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:"upload()"javascript函数使用jquery到post的形式。
function upload(obj) {
var p = $(obj).parent();
if (p.get(0).tagName != 'FORM') {
p = p.parent();
}
p.submit();
}
在我的控制器中,我将其用作模型绑定器 "HttpPostedFileBase"。
[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);
}
在网络 API 控制器中,您可以使用以下代码访问 XML 文件:-
HttpPostedFile xmlFile = HttpContext.Current.Request.Files[0];
如果您发布了多个文件,请将 Files[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);
然后您可以执行节点提供的任何功能。
我有一个 ASP.NET MVC 项目,它需要一个 API 控制器,它将接受发布的多部分表单并从 <formroot>
xml 标签中提取数据(突出显示)
我正在努力使这项工作正常进行任何帮助将不胜感激
目前我有一个名为 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 中获取数据的最佳方式,如果上面的任何代码不正确,也请原谅我。
我总是使用以下解决方案:
<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:"upload()"javascript函数使用jquery到post的形式。
function upload(obj) {
var p = $(obj).parent();
if (p.get(0).tagName != 'FORM') {
p = p.parent();
}
p.submit();
}
在我的控制器中,我将其用作模型绑定器 "HttpPostedFileBase"。
[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);
}
在网络 API 控制器中,您可以使用以下代码访问 XML 文件:-
HttpPostedFile xmlFile = HttpContext.Current.Request.Files[0];
如果您发布了多个文件,请将 Files[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);
然后您可以执行节点提供的任何功能。