使用automapper从HttpPostedFileBase映射到Byte []

时间:2014-08-11 11:59:49

标签: c# asp.net-mvc-5 automapper

我试图上传图片并使用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才能让它工作?

2 个答案:

答案 0 :(得分:6)

至少有两种方法可以做到这一点:

  1. 使用custom type converter

    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>();
    
  2. 使用ConstructUsing并以内联方式执行:

    Mapper.CreateMap<HttpPostedFileBase, byte[]>()
        .ConstructUsing(fb =>
    {
        MemoryStream target = new MemoryStream();
        fb.InputStream.CopyTo(target);
        return target.ToArray();
    });
    

答案 1 :(得分:1)

这不是从文件上传中读取字节的最佳方法,因为IIS会在上载过程开始时分配上传文件的整个大小。然后你的映射器分配另一个相似大小的字节(byte []数组是一个新变量),总内存使用量将是文件字节* 2.

我的建议是阅读发布的文件流并将其写入某处。您可以在上传后进行任何上传后处理。