禁用DiskCache插件时,图像无法显示。

时间:2017-08-17 07:35:38

标签: c# stream imageresizer

我一直在使用带有DiskCache插件的基本ImageResizer库。由于磁盘空间的原因,我需要使用CDN来释放网络服务器上的空间。

为了防止创建本地磁盘缓存,根据文档,我添加了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   &#34;不支持指定的方法。&#34;   &#34;在System.Web.HttpResponseStream.get_Position()&#34;

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

Stack

1 个答案:

答案 0 :(得分: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&#39;使用修补程序和配置更改以使用它来绘制插件版本的脏点。

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