asp.net-mvc – 如何为ASP.NET 4.5 Web API创建MultipartFormFormatter
发布时间:2020-05-28 05:15:49 所属栏目:asp.Net 来源:互联网
导读:这些链接对我没有帮助: Way 1 Way 2 例: //Model:public class Group{ public int Id { get; set; } public File File { get; set; }}//Controller:[HttpPost]public void SaveGroup([FromBody]Grou
|
这些链接对我没有帮助: > Way 1 例: //Model:
public class Group
{
public int Id { get; set; }
public File File { get; set; }
}
//Controller:
[HttpPost]
public void SaveGroup([FromBody]Group group) {}
//Formatter:
public class MultipartFormFormatter : MediaTypeFormatter
{
private const string StringMultipartMediaType = "multipart/form-data";
public MultipartFormFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue(StringMultipartMediaType));
}
public override bool CanReadType(Type type)
{
return true;
}
public override bool CanWriteType(Type type)
{
return false;
}
public async override Task<object> ReadFromStreamAsync(Type type,Stream readStream,HttpContent content,IFormatterLogger formatterLogger)
{
//Implementation? What here should be?
}
}
ReadFromStreamAsync方法应该返回什么? 如何使它能够正确地将参数传递给动作? 解决方法public class MultipartFormFormatter : FormUrlEncodedMediaTypeFormatter
{
private const string StringMultipartMediaType = "multipart/form-data";
private const string StringApplicationMediaType = "application/octet-stream";
public MultipartFormFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue(StringMultipartMediaType));
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue(StringApplicationMediaType));
}
public override bool CanReadType(Type type)
{
return true;
}
public override bool CanWriteType(Type type)
{
return false;
}
public override async Task<object> ReadFromStreamAsync(Type type,IFormatterLogger formatterLogger)
{
var parts = await content.ReadAsMultipartAsync();
var obj = Activator.CreateInstance(type);
var propertiesFromObj = obj.GetType().GetRuntimeProperties().ToList();
foreach (var property in propertiesFromObj.Where(x => x.PropertyType == typeof(FileModel)))
{
var file = parts.Contents.FirstOrDefault(x => x.Headers.ContentDisposition.Name.Contains(property.Name));
if (file == null || file.Headers.ContentLength <= 0) continue;
try
{
var fileModel = new FileModel(file.Headers.ContentDisposition.FileName,Convert.ToInt32(file.Headers.ContentLength),ReadFully(file.ReadAsStreamAsync().Result));
property.SetValue(obj,fileModel);
}
catch (Exception e)
{
}
}
foreach (var property in propertiesFromObj.Where(x => x.PropertyType != typeof(FileModel)))
{
var formData = parts.Contents.FirstOrDefault(x => x.Headers.ContentDisposition.Name.Contains(property.Name));
if (formData == null) continue;
try
{
var strValue = formData.ReadAsStringAsync().Result;
var valueType = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
var value = Convert.ChangeType(strValue,valueType);
property.SetValue(obj,value);
}
catch (Exception e)
{
}
}
return obj;
}
private byte[] ReadFully(Stream input)
{
var buffer = new byte[16 * 1024];
using (var ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer,buffer.Length)) > 0)
{
ms.Write(buffer,read);
}
return ms.ToArray();
}
}
}
public class FileModel
{
public FileModel(string filename,int contentLength,byte[] content)
{
Filename = filename;
ContentLength = contentLength;
Content = content;
}
public string Filename { get; set; }
public int ContentLength { get; set; }
public byte[] Content { get; set; }
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ASP.NET MVC 3 Razor:初始化一个JavaScript数组
- 在将所有websocket数据发送到客户端之前,ASP.NET关闭连接
- asp.net-mvc – ASP.NET MVC – CustomeAuthorize使用外部网
- 在asp.net MVC Javascript事件中没有命中断点
- asp.net – GET与POST真的很重要吗?
- asp.net – RenderBody和RenderSection之间的区别
- ASP.Net Response.Redirect不能在Application_Error中工作?
- asp.net-web-api – 如何确保ASP.net Web API控制器的参数不
- asp.net-mvc – 具有Fluent nHibernate和Ninject的多租户.每
- 用ASP.NET MVC阻止ZmEu攻击
推荐文章
站长推荐
- asp.net-mvc – ASP.NET MVC FileStreamResult不
- asp.net核心中的Request.CreateResponse
- 中国网通新版400电话 - 企业直线
- asp.net-mvc-4 – 如何在asp.net mvc4中将OpenID
- 防止ASP.Net中的重复回发(C#)
- 如何在ASP.Net Gridview中添加“确认删除”选项?
- SimpleModal打破ASP.Net回传
- 在Asp.Net中使用JQuery绑定DropDownlists
- asp.net – 页面查看计数器像StackOverFlow
- asp.net-mvc-3 – MVC3值不能为null 参数名称:值
热点阅读
