title: Azure WebJobs Blob Trigger - multiple resizes
body: <p>I'm attempting to create C# Azure WebJob which is triggered on a new Blob creation to resize the uploaded image into three different sizes.  I found and followed this great <a href="http://ppolyzos.com/2016/03/22/azure-webjobs-to-resize-an-image-to-multiple-dimensions/" rel="nofollow">tutorial</a>.</p>
  
  <p>There are two sections, the first portion "works" but enters into a recursion loop as the creation of the three new sizes triggers the script, which creates three more instances for each of three new images, so forth and so forth.  This was intentional, to highlight the need for the final implementation.</p>
  
  <p>Here is the initial recursion loop code which "works" location in the Functions.cs file:</p>
  
  <pre><code>public static void ResizeImagesW800([BlobTrigger("input/{name}.{ext}")] Stream input,
      [Blob("output/{name}-w800.{ext}", FileAccess.Write)] Stream output)
  {
      ResizeImage(input, output, 800);
  }
  
  public static void ResizeImagesW500([BlobTrigger("input/{name}.{ext}")] Stream input,
      [Blob("output/{name}-w500.{ext}", FileAccess.Write)] Stream output)
  {
      ResizeImage(input, output, 500);
  }
  
  private static void ResizeImage(Stream input, Stream output, int width)
  {
      var instructions = new Instructions
      {
          Width = width,
          Mode = FitMode.Carve,
          Scale = ScaleMode.Both
      };
      ImageBuilder.Current.Build(new ImageJob(input, output, instructions));
  }
  </code></pre>
  
  <p>Here is the code which Visual Studio 2015 gives an error on:</p>
  
  <pre><code>public static void ResizeImagesTask(
      [BlobTrigger("input/{name}.{ext}")] Stream inputBlob,
      string name,
      string ext,
      IBinder binder)
  {
      int[] sizes = { 800, 500, 250 };
      var inputBytes = inputBlob.CopyToBytes();
      foreach (var width in sizes)
      {
          var input = new MemoryStream(inputBytes);
          var output = binder.Bind&lt;Stream&gt;(new BlobAttribute($"output/{name}-w{width}.{ext}", FileAccess.Write));
  
          ResizeImage(input, output, width);
      }
  }
  
  private static void ResizeImage(Stream input, Stream output, int width)
  {
      var instructions = new Instructions
      {
          Width = width,
          Mode = FitMode.Carve,
          Scale = ScaleMode.Both
      };
      ImageBuilder.Current.Build(new ImageJob(input, output, instructions));
  }
  </code></pre>
  
  <p>The error is thrown at this line:</p>
  
  <pre><code> var inputBytes = inputBlob.CopyToBytes();
  </code></pre>
  
  <p>The error is:</p>
  
  <pre><code>CS1061: 'Stream' does not contain a definition for 'CopyToBytes' and no extension method 'CopyToBytes' accepting a first argument of type 'Stream' could be found (are you missing a using directive or an assembly reference?)
  </code></pre>
  
  <p>I've tried using .NET 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1 as target frameworks, but all of them throw the same error.</p>
  
  <p>Also, here are the using statements for the Functions.cs file:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.IO;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using Microsoft.Azure.WebJobs;
  using Microsoft.WindowsAzure.Storage;
  using ImageResizer;
  </code></pre>
  
  <p>What am I doing wrong here?  Thanks!</p>
  
  <p>UPDATE 1</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.IO;
  using System.Web;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  using Microsoft.Azure.WebJobs;
  using Microsoft.WindowsAzure.Storage;
  using ImageResizer;
  using ImageResizer.ExtensionMethods;
  using Microsoft.WindowsAzure.Storage.Blob;
  
  namespace HilcoIndustrialAssetApiWebJob
  {
      public class Functions
      {
          // output blolb sizes
          private static readonly int[] Sizes = { 800, 500, 250 };
  
          public static void ResizeImagesTask(
          [QueueTrigger("newfileuploaded")] string filename,
          [Blob("input/{queueTrigger}", FileAccess.Read)] Stream blobStream,
          [Blob("output")] CloudBlobContainer container)
          {
              // Extract the filename  and the file extension
              var name = Path.GetFileNameWithoutExtension(filename);
              var ext = Path.GetExtension(filename);
  
              Console.WriteLine("New Blob name -&gt; " + name);
  
              // Get the mime type to set the content type
              var mimeType = MimeMapping.GetMimeMapping(filename);
  
              foreach (var width in Sizes)
              {
                  // Set the position of the input stream to the beginning.
                  blobStream.Seek(0, SeekOrigin.Begin);
  
                  // Get the output stream
                  var outputStream = new MemoryStream();
                  ResizeImage(blobStream, outputStream, width);
  
                  // Get the blob reference
                  var blob = container.GetBlockBlobReference($"{name}_{width}.{ext}");
  
                  // Set the position of the output stream to the beginning.
                  outputStream.Seek(0, SeekOrigin.Begin);
                  blob.UploadFromStream(outputStream);
  
                  // Update the content type =&gt;  don't know if required
                  blob.Properties.ContentType = mimeType;
                  blob.SetProperties();
              }
          }
  
          private static void ResizeImage(Stream input, Stream output, int width)
          {
              var instructions = new Instructions
              {
                  Width = width,
                  Mode = FitMode.Carve,
                  Scale = ScaleMode.Both
              };
              var imageJob = new ImageJob(input, output, instructions);
  
              // Do not dispose the source object
              imageJob.DisposeSourceObject = false;
              imageJob.Build();
          }
      }
  }
  </code></pre>