2017-08-17 35 views
0

我一直在使用带有DiskCache插件的基本ImageResizer库。由于磁盘空间的限制,我需要转而使用CDN来释放网络服务器上的空间。禁用DiskCache插件时,图像无法显示。

为了防止创建本地磁盘缓存,按照该文档中,我在配置增加了enabled属性和设置为false

<diskcache dir="~/Content/Resize" enabled="false" /> 

不幸的是,现在,请求图像时会出现什么。使所有异常后,我已经成功地缩小到这个例程在ImageResizer.Plugins.Basic:“不支持指定的方法。”

public static void SaveJpeg(Image b, Stream target, int quality) 
{ 
    if (quality < 0) 
    quality = 90; 
    if (quality > 100) 
    quality = 100; 
    using (EncoderParameters encoderParams = new EncoderParameters(1)) 
    { 
    using (EncoderParameter encoderParameter = new EncoderParameter(Encoder.Quality, (long) quality)) 
    { 
     encoderParams.Param[0] = encoderParameter; 

     // NOTE: this would appear to be the trigger 
     b.Save(target, DefaultEncoder.GetImageCodeInfo("image/jpeg"), encoderParams); 
     // NOTE 
    } 
    } 
} 

System.NotSupportedException “在System.Web.HttpResponseStream.get_Position()”

任何人都可以帮助解决这个问题?

Stack

+0

的HttpResponse不能贪图这就是为什么Position属性抛出(它不支持它)。它看起来像ImageResizer库需要一个可以搜索的目标流。在写入实际目标流之前,首先将图像保存到临时流(可能是MemoryStream)。 –

+0

@Ilian Pinzon你知道这是新的行为吗?我假设在一个阶段图书馆没有工作保存到目标(响应)流... –

+0

我敢打赌,这是因为你禁用了Diskacche插件。它可能在写入FileStream之前。 –

回答

0

这是固定在最新的版本(4.1.9)。

这是由于DefaultEncoder插件尝试将图像直接写入响应流。也许.NET Framework中的一个变化阻止了寻找响应流来中断保存例程。

有一种解决问题的方法,它涉及使用插件的补丁版本(感谢@Ilian Pinzon)。这写入临时流写入到响应流之前:

private static void SaveJpeg(Image image, Stream target, int quality) 
{ 
    if (quality < 0) 
     quality = 90; //90 is a very good default to stick with. 

    if (quality > 100) 
     quality = 100; 

    using (EncoderParameters p = new EncoderParameters(1)) 
    { 
     using (EncoderParameter ep = new EncoderParameter(Encoder.Quality, quality)) 
     { 
      p.Param[0] = ep; 

      ImageCodecInfo info = ImageResizer.Plugins.Basic.DefaultEncoder.GetImageCodeInfo("image/jpeg"); 

      if (!target.CanSeek) 
      { 
       using (MemoryStream ms = new MemoryStream(_streamCopyBuffer)) 
       { 
        image.Save(ms, info, p); 
        ms.WriteTo(target); 
       } 
      } 
      else 
      { 
       image.Save(target, info, p); 
      } 
     } 
    } 
} 

我创建了一个快速N”脏要点负责起草一个版本,与修订和配置的变化用它的插件。

https://gist.github.com/restlessmedia/9401155f40bd12d40d6affb53c4231b5