我试图上传图片并使用automapper将其从HttpPostedFileBase转换为Byte []。这是我的CreateMap:
Mapper.CreateMap<HttpPostedFileBase, Byte[]>()
.ForMember(d => d, opt => opt.MapFrom(s =>
{
MemoryStream target = new MemoryStream();
s.InputStream.CopyTo(target);
return target.ToArray();
}));
我在s上遇到错误:带有语句体的lambda表达式无法转换为表达式树。
那么我该如何编写我的CreateMap才能让它工作?
答案 0 :(得分:6)
至少有两种方法可以做到这一点:
public class HttpPostedFileBaseTypeConverter :
ITypeConverter<HttpPostedFileBase, byte[]>
{
public byte[] Convert(ResolutionContext ctx)
{
var fileBase = (HttpPostedFileBase)ctx.SourceValue;
MemoryStream target = new MemoryStream();
fileBase.InputStream.CopyTo(target);
return target.ToArray();
}
}
用法:
Mapper.CreateMap<HttpPostedFileBase, byte[]>()
.ConvertUsing<HttpPostedFileBaseTypeConverter>();
使用ConstructUsing
并以内联方式执行:
Mapper.CreateMap<HttpPostedFileBase, byte[]>()
.ConstructUsing(fb =>
{
MemoryStream target = new MemoryStream();
fb.InputStream.CopyTo(target);
return target.ToArray();
});
答案 1 :(得分:1)
这不是从文件上传中读取字节的最佳方法,因为IIS会在上载过程开始时分配上传文件的整个大小。然后你的映射器分配另一个相似大小的字节(byte []数组是一个新变量),总内存使用量将是文件字节* 2.
我的建议是阅读发布的文件流并将其写入某处。您可以在上传后进行任何上传后处理。