2011-02-01 1 views
2

私は、Request.InputStreamを使って画像を保存する方法をいくつか持っています。私は、HttpContextを共有する2つの拡張機能を持っています。私のメソッドの1つでは、BinaryReaderを使って内容を読み込んで処理しています。しかし、当然、BinaryReaderを破棄すると、RequestのInputStreamプロパティが閉じられます。私のSECONDメソッドは同じ入力ストリームを使ってサムネイルを作成します。Request.InputStreamを有効にするためにBinaryReaderオブジェクトを未配置のままにしておきますか?

私は、最初のメソッドでリーダーを処理した後、Request.InputStreamプロパティを有効に保つ方法が必要です。これは可能ですか?ここに私の2つの方法があります。 SaveImageStream()が最初に呼び出された後、GenerateThumbnail()が呼び出されます。

public static void SaveImageStream(this HttpContextBase ctx, string filename) 
{ 
    var config = ObjectFactory.GetInstance<IConfig>(); 

    using (var reader = new BinaryReader(ctx.Request.InputStream)) 
    { 
     var bandImagesPath = config.GetSetting<string>("BandImagePath"); 
     var path = Path.Combine(ctx.Server.MapPath(bandImagesPath), filename); 

     byte[] file = reader.ReadBytes((int)ctx.Request.InputStream.Length); 

     using (var outputStream = System.IO.File.Create(path, 2048)) 
     { 
      const int chunkSize = 2 * 1024; // 2KB 
      byte[] buffer = new byte[chunkSize]; 
      int bytesRead; 
      ctx.Request.InputStream.Position = 0; 
      while ((bytesRead = ctx.Request.InputStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       outputStream.Write(buffer, 0, bytesRead); 
      } 
     } 
    } 
} 

public static void GenerateThumbnail(this HttpContextBase ctx, string filename) 
{ 
    var config = ObjectFactory.GetInstance<IConfig>(); 

    int size = config.GetSetting<int>("ThumbSize"); 
    var thumbPath = Path.Combine(ctx.Server.MapPath(config.GetSetting<string>("ThumbPath")), filename); 

    var image = System.Drawing.Image.FromStream(ctx.Request.InputStream); 
    var thumb = image.GetThumbnailImage(size, size, null, IntPtr.Zero); 

    thumb.Save(thumbPath, System.Drawing.Imaging.ImageFormat.Png); 
} 

答えて

0

から別のメソッドを呼び出すことによって、あなたはusing文の中ですべてを行うことができます。私はまた、このラインについて思ったんだけど:あなたは、メモリ内の全体の要求ストリームの常駐を持ってどこにでもfile変数を使用していない

byte[] file = reader.ReadBytes((int)ctx.Request.InputStream.Length); 

。注意しないと、これはDoS攻撃の手段になります。しかし、上の溶液に...

変更サムネイル方法は次のように見て:

public static void SaveImageStream(this HttpContextBase ctx, string filename) 
{ 
    var config = ObjectFactory.GetInstance<IConfig>(); 

    using (var reader = new BinaryReader(ctx.Request.InputStream)) 
    { 
     var bandImagesPath = config.GetSetting<string>("BandImagePath"); 
     var path = Path.Combine(ctx.Server.MapPath(bandImagesPath), filename); 

     using (var outputStream = System.IO.File.Create(path, 2048)) 
     { 
      const int chunkSize = 2 * 1024; // 2KB 
      byte[] buffer = new byte[chunkSize]; 
      int bytesRead; 
      ctx.Request.InputStream.Position = 0; 
      while ((bytesRead = ctx.Request.InputStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       outputStream.Write(buffer, 0, bytesRead); 
      } 
     } 

     ctx.Request.InputStream.Position = 0; 
     ctx.GenerateThumbnail(filename); 
    } 
} 

また、あなたはそのfile属性の周りのMemoryStreamを使用し、GenerateThumbnail拡張メソッドにそれを送ることができます。

関連する問題