基本上我正在尝试使用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控制器上传模型和文件?
答案 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'