如何使用Web API上传文件和模型?

时间:2016-03-16 18:58:21

标签: asp.net rest http asp.net-web-api asp.net-web-api2

基本上我正在尝试使用Web API 2上传图像和枚举。

这是控制器签名:

[HttpPost]
public UploadResponseVm Upload([FromBody]ResImageType type)
{

问题是,每当我尝试发布多部分表单(带有文件和类型)时,我都会收到415错误:

  

{“消息”:“请求实体的媒体类型'multipart / form-data'是   不支持此资源。“,”ExceptionMessage“:”不   MediaTypeFormatter可用于读取类型的对象   来自媒体类型的内容的“ResImageType”   '多部分/格式数据' “” ExceptionType。 “:” System.Net.Http.UnsupportedMediaTypeException “ ”堆栈跟踪“:”   在System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent)   content,Type type,IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable 1格式化程序,IFormatterLogger   formatterLogger,CancellationToken cancellationToken)“}

我甚至在startup.cs类中添加了以下内容:

    config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

如何使用web api控制器上传模型和文件?

2 个答案:

答案 0 :(得分:0)

没有格式化程序可以处理/关联您的# bootstrap.yml spring: application: name: router eureka: client: register-with-eureka: false fetch-registry: false # application.yml server: port: 8761 对象。我曾经使用无参数方法解决了没有格式化程序的类似问题,并处理了方法中的数据。例如:

ResImageType

来自MS Docs

的类似解决方案

另一种可能性是创建一个类似DTO的类,用于传输对象并使用格式化程序,例如MultipartDataMediaFormatter似乎是合法的(尚未尝试过)。

答案 1 :(得分:0)

您可以通过在标头请求中添加内容类型来简单地同时添加媒体和枚举。

Content-Type:application/x-www-form-urlencoded

然后尝试访问文件和枚举

[HttpPost]
public UploadResponseVm Upload()
{
            //Get enum type
            var enumkey = HttpContext.Current.Request.Form.AllKeys.FirstOrDefault(x => x == "enumkey");
            var enumType = Convert.ToInt32(HttpContext.Current.Request.Form[enumkey]).ToEnum<ResImageType>();

            //Access files
            var postedFileLst = HttpContext.Current.Request.Files.GetMultiple("fileKey").ToList();
}

使用扩展方法转换为枚举

public static T ToEnum<T>(this int param)
{
            var info = typeof(T);
            if (info.IsEnum)
            {
                T result = (T)Enum.Parse(typeof(T), param.ToString(), true);
                return result;
            }

            return default(T);
}

还可以使用curl进行验证

curl --location --request POST '{{hostname}}/api/media/addmedia' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--form 'BookLogos=@/path/to/file' \
--form 'enumkey=1'