2017-08-17 10 views
0

私はDiskCacheプラグインで基本的なImageResizerライブラリを使用しています。ディスク容量のため、私はCDNを使用してWebサーバーのスペースを解放する必要がありました。ドキュメントごとに、私はenabledプロパティを追加しましたし、設定にfalseに設定し、ローカルディスクキャッシュを作成しないようにするにDiskCacheプラグインを無効にすると、イメージが表示されません。

残念ながら
<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 「指定したメソッドがサポートされていません。」 "at 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

関連する問題