Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在asp.net web api中提交带有可选文件数据的表单数据_C#_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 4_Asp.net Web Api - Fatal编程技术网

C# 如何在asp.net web api中提交带有可选文件数据的表单数据

C# 如何在asp.net web api中提交带有可选文件数据的表单数据,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Asp.net Web Api,我正在开发Asp.NETMVCWebAPI。我正在尝试通过asp.NETWebAPI发布html表单。我的表单包含文本框等控件和文件上载控件,如 @using (Html.BeginForm("PostImage", "Home", FormMethod.Post, new { id = "form1", enctype = "multipart/form-data" })) { <input type="text" id="name" name="name"/&g

我正在开发Asp.NETMVCWebAPI。我正在尝试通过asp.NETWebAPI发布html表单。我的表单包含文本框等控件和文件上载控件,如

 @using (Html.BeginForm("PostImage", "Home", FormMethod.Post, new { id = "form1", enctype = "multipart/form-data" }))
    {
       <input type="text" id="name" name="name"/>
       <input type="file" id="file" name="file"/>
       <input type="submit" value="upload"/>
     }
@使用(Html.BeginForm(“posimage”,“Home”,FormMethod.Post,new{id=“form1”,enctype=“multipart/form data”}))
{
}
我的api控制器是这样的

[HttpPost]
    public async Task<HttpResponseMessage> PostImage(HttpRequestMessage request)
    {
       try
       {
          string imagename = "";
string name="";
          if (!request.Content.IsMimeMultipartContent("form-data"))
          {
              return request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, new HttpError() { { "status", "failed" }, { "message", "Invalid file format" } });
          }
          else
          {
               string PATH = ConfigurationManager.AppSettings["ImageuploadPath"].ToString();//
               var streamProvider = new CustomMultipartFormDataStreamProvider(PATH);
               await Request.Content.ReadAsMultipartAsync(streamProvider);
               foreach (var file1 in streamProvider.FileData)
               {
                  FileInfo fileInfo = new FileInfo(file1.LocalFileName);
                  imagename = fileInfo.Name;
               }
                name = Convert.ToString(streamProvider.FormData["name"]);
            }
            if (imagename == "")
            {
               imagename = "NOIMAGE";
            }
             //save those two fields   
          }
          catch (Exception ex)
          {
             return request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError() { { "status", "failed" }, { "message", ex.InnerException } });
          }
     }
[HttpPost]
公共异步任务PostImage(HttpRequestMessage请求)
{
尝试
{
字符串imagename=“”;
字符串名称=”;
if(!request.Content.IsMimeMultipartContent(“表单数据”))
{
return request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType,新的HttpError(){{“status”,“failed”},{“message”,“无效文件格式”});
}
其他的
{
字符串路径=ConfigurationManager.AppSettings[“ImageuploadPath”].ToString()//
var streamProvider=新的CustomMultipartFormDataStreamProvider(路径);
wait Request.Content.ReadAsMultipartAsync(streamProvider);
foreach(streamProvider.FileData中的var file1)
{
FileInfo FileInfo=newfileinfo(file1.LocalFileName);
imagename=fileInfo.Name;
}
name=Convert.ToString(streamProvider.FormData[“name”]);
}
如果(imagename==“”)
{
imagename=“NOIMAGE”;
}
//保存这两个字段
}
捕获(例外情况除外)
{
return request.CreateErrorResponse(HttpStatusCode.InternalServerError,新的HttpError(){{“status”,“failed”},{“message”,ex.InnerException});
}
}

当我向控制器提交图像和名称字段值时,上面的代码工作正常。在我的表单中,仅名称字段是必需的,但图像字段不是必需的,用户可能无法提交其图像。在这种情况下,我的控制器会抛出不支持的媒体类型的错误。是否有任何方式可以选择提交图像或表单数据。如果我写两个动作,一个用于图像,另一个用于表单数据,但维护数据可能非常困难,我认为这也是一种不好的做法。如果我走错了路,请引导我。提前谢谢。

您能分享一下您原始请求的样子吗..可能是来自Fiddler?…根据您上面提到的,如果(!request.Content.IsMimeMultipartContent(“表单数据”)),它在检查
时失败。对吗?我试图在我这边重新编程,但无法重新编程…顺便说一句,我在Chrome和IE浏览器上进行了尝试…这可能有点帮助。。。文章中还有一些指向GitHub回购协议的链接。