gpt4 book ai didi

asp.net-mvc - 如何为 ASP.NET 4.5 Web API 创建 MultipartFormFormatter

转载 作者:行者123 更新时间:2023-12-04 02:43:20 24 4
gpt4 key购买 nike

这些链接对我没有帮助:

例子:

//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, Stream readStream, HttpContent content, 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, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, 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 - 如何为 ASP.NET 4.5 Web API 创建 MultipartFormFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17924655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com