【问题标题】:Map from HttpPostedFileBase to Byte[] with automapper使用自动映射器从 HttpPostedFileBase 映射到 Byte[]
【发布时间】:2014-08-11 11:59:48
【问题描述】:

我正在尝试上传图片并使用 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 来让它工作呢?

【问题讨论】:

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


    【解决方案1】:

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

    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();
      });
      

    【讨论】:

    • 如果有人在 AutoMapper v6 及更高版本中使用它,转换参数将如下所示:Convert(HttpPostedFileBase source, byte[] destination, ResolutionContext ctx),我们将使用source 而不是ctx.SourceValue
    【解决方案2】:

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

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

    【讨论】:

    • 我明白你的意思,但不完全理解如何去做。你能发布一些示例代码吗?
    • 您可以使用 FileStream 代替 MemoryStream 或者您可以轻松地使用 SaveAs 方法。如果没有调整大小、编码等处理,则在上传完成后进行。如果上传文件没有处理,则避免映射或重用或将流/数据复制到另一个变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多