<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ryan Bosinger &#187; ASP.NET</title>
	<atom:link href="http://ryanbosinger.com/blog/category/aspnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://ryanbosinger.com/blog</link>
	<description>things I learn, as I learn them</description>
	<lastBuildDate>Thu, 19 Aug 2010 16:59:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Save images from Flash to your server using ASP.NET webservices</title>
		<link>http://ryanbosinger.com/blog/2008/saving-images-with-net/</link>
		<comments>http://ryanbosinger.com/blog/2008/saving-images-with-net/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 18:29:38 +0000</pubDate>
		<dc:creator>rbosinger</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://ryanbosinger.com/blog/?p=42</guid>
		<description><![CDATA[    
        
            
                Problem:
            
   [...]]]></description>
			<content:encoded><![CDATA[    <div class="problem-solution">
        <p class="problem">
            <strong>
                Problem:
            </strong>
        </p> 
        <blockquote>
You want to save an image from Flash to a server using Actionscript 3.0 and ASP.NET.
        </blockquote> 
        
        <p class="solution">
            <strong>
                Solution:
            </strong>
        </p>
        <blockquote>
            Read this article!
        </blockquote>
    </div>
<span id="more-42"></span>
<p>
<strong>Note: </strong>
This blog is hosted on a Linux based server that uses PHP, therefore I can&#8217;t show you a working example directly on this blog (unless anyone with a Windows based hosting account would like to host one for me?).  However, I can assure you this <em>does</em> work and you can download the files here and try it for yourself.
</p>

<p class="download">
<a href="/blog/downloads/FlashBitmapSave.zip">
Download &#8220;FlashBitmapSave.zip&#8221;
</a>
<p>
<div class="google_ads_01">
<script type="text/javascript"><!--
google_ad_client = "pub-1962502741893893";
/* 468x60, created 5/27/08 */
google_ad_slot = "8820555819";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<h3>Get this thing running</h3>
<span><em>&#8230;or just take a look at the code/explanation&#8230;</em></span><br/>
<p>
<a href='http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_06-sep-18-1021.gif'><img src="http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_06-sep-18-1021.gif" alt="" title="screenhunter_06-sep-18-1021" width="429" height="86" class="alignnone size-full wp-image-45" /></a>
</p>

<p>Open the downloaded website in Visual Studio 2008 or Visual Web Developer Express 2008.  2005 versions should be fine as well.</p>

<p>
<a href='http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_07-sep-18-1021.gif'><img src="http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_07-sep-18-1021.gif" alt="" title="screenhunter_07-sep-18-1021" class="alignnone size-full wp-image-44" /></a>
</p>

<p>Run it.</p>

<p>
<a href='http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_08-sep-18-1046.gif'><img src="http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_08-sep-18-1046.gif" alt="" title="screenhunter_08-sep-18-1046" class="alignnone size-full wp-image-46" /></a>
</p>

<p>The default page should come up in your browser.  You&#8217;ll see my example Flash app.  Draw a picture and click &#8220;save to server&#8221; to &#8211; of course &#8211; save a JPEG version of your drawing from Flash.</p>

<p><strong>Note:</strong> Saved JPEGs will be assigned a random GUID as a filename and saved directly to the root of your C: drive.  You can modify the path in App_Code/Service.vb.  If you need to know more about that aspect of it, I would continue reading the rest of this post.</p>

<p><strong>If the flash app comes up but gives you the message &#8220;<em>webservice failed to initialize&#8230;</em>&#8221; then:</strong></p>

<p>Click on the root of the project in your solution explorer.</p>
<a href='http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_09-sep-18-1648.gif'><img src="http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_09-sep-18-1648.gif" alt="" title="screenhunter_09-sep-18-1648" class="alignnone size-full wp-image-47" /></a>
<br/><br/>
<p>In the properties panel below, take a look at your Virtual Path.</p>
<a href='http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_10-sep-18-1649.gif'><img src="http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_10-sep-18-1649.gif" alt="" title="screenhunter_10-sep-18-1649" class="alignnone size-full wp-image-48" /></a>
<br/><br/>
<p>It should only have a &#8220;/&#8221; in it.</p>
<a href='http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_11-sep-18-1649.gif'><img src="http://ryanbosinger.com/blog/wp-content/uploads/2008/09/screenhunter_11-sep-18-1649.gif" alt="" title="screenhunter_11-sep-18-1649"  class="alignnone size-full wp-image-49" /></a>
<br/><br/>
<p>Try it again.</p>

<div class="google_ads_01">
<script type="text/javascript"><!--
google_ad_client = "pub-1962502741893893";
/* 468x60, created 5/27/08 */
google_ad_slot = "8820555819";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<h3>The process</h3>

<ul>
<li>Take a BitmapData object in Flash, and convert it to a ByteArray object using the JPGEncoder class (or, in my example, the Asynchronous JPEG Encoder class).</li>
<li>Take that ByteArray and Base64 encode it.  We do this so that Actionscript and the .NET back-end will be speaking the same language.  If we were using Flex and remoting software like WebORB, this type of conversion would likely happen automatically when sending or receiving a ByteArray object to/from Actionscript or .NET.  But for this one-off scenario, doing it ourselves isn&#8217;t a big deal.</li>
<li>Use a third party AS3 webservice class to send the encoded ByteArray to our .NET webservice.</li>
<li>Our .NET webservice unencodes the ByteArray into its own form of ByteArray, creates a random file name using a GUID, and then saves the raw binary information to a .jpg file.</li>
</ul>

<h3>Some extra stuff you will need</h3>

<ul>
   <li>
		<strong>
			<a href="http://dynamicflash.com/goodies/base64/">
				Base64 encoder/decoder class
			</a>
		</strong>
		<br/>
		This class from Dynamic Flash will be used to encode our ByteArray to Base64.
   </li>
   <li>
		<strong>
			<a href="http://www.wellconsidered.be/blog/as3-webservice-component/">
				WebService component
			</a>
		</strong>
		<br/>
		Adobe left the WebService classes out of Flash CS3.  wellconsidered made their own.  This is how we&#8217;ll be communicating with the server.  This download is available as a .swc and needs to be dropped
		into your .fla to work.
   </li>
   <li>
		<strong>
			<a href="http://blog.paranoidferret.com/index.php/2007/12/11/flex-tutorial-an-asynchronous-jpeg-encoder/">
				Asynchronous JPEG Encoder
			</a>
		</strong>
		<br/>
		In my example I use the Asynchronous JPEG Encoder.  You could also use Adobe&#8217;s regular JPEG encode available in the <a href="http://code.google.com/p/as3corelib/">AS3 CoreLib</a>.
   </li>
</ul>

<div class="google_ads_01">
<script type="text/javascript"><!--
google_ad_client = "pub-1962502741893893";
/* 468x60, created 5/27/08 */
google_ad_slot = "8820555819";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<h3>The Code</h3>

<p>
Now I&#8217;m just going to post the code.  I did my best to comment the code thoroughly, but I&#8217;m not going to go through it line by line in this post.  I&#8217;ll assume that if you&#8217;re in need of saving bitmap information from flash to a server using .NET, that most of what&#8217;s going on you already understand and maybe just needed an example to help you along.  So here ya go!
</p>

<h4>The actionscript 3.0 code:</h4>


<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">Bitmap</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">BitmapData</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.text</span>.<span style="color: #004993;">TextField</span>;
        <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.net</span>.<span style="color: #000000; font-weight: bold;">*</span>;
        <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #000000; font-weight: bold;">*</span>;
        <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">MovieClip</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.utils</span>.<span style="color: #004993;">ByteArray</span>;
&nbsp;
	<span style="color: #009900;">// We'll be sending a ByteArray encoded as Base64, and then decoding it on the .NET side.</span>
	<span style="color: #009900;">// http://dynamicflash.com/goodies/base64/</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> com.dynamicflash.util.Base64;
&nbsp;
	<span style="color: #009900;">// be.wellconsidered classes give us an easy means to communicate with webservices.</span>
	<span style="color: #009900;">// The extension needs to be installed and the component then dropped into your .FLA.</span>
	<span style="color: #009900;">// You'll see a component called &quot;Service&quot; in the library of the example .FLA.</span>
	<span style="color: #009900;">// http://www.wellconsidered.be/blog/as3-webservice-component/</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> be.wellconsidered.services.WebService;
	<span style="color: #0033ff; font-weight: bold;">import</span> be.wellconsidered.services.Operation;
	<span style="color: #0033ff; font-weight: bold;">import</span> be.wellconsidered.services.events.OperationEvent;
	<span style="color: #0033ff; font-weight: bold;">import</span> be.wellconsidered.services.events.WebServiceEvent;
&nbsp;
	<span style="color: #009900;">// com.pfp includes classes for the Asynchronous JPEG encoder.  There is also a JPEG encoder</span>
	<span style="color: #009900;">// in Adobe's CoreLib (http://code.google.com/p/as3corelib/), but because this one is asynchronous it allows to </span>
	<span style="color: #009900;">// monitor the rendering of the jpeg and therefore create a progress bar.  It is also essential when rendering larger</span>
	<span style="color: #009900;">// bitmaps, otherwise Flash could time out during the processing.</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> com.pfp.events.<span style="color: #000000; font-weight: bold;">*</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> com.pfp.utils.<span style="color: #000000; font-weight: bold;">*</span>;
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> FlashBitmapSave extends <span style="color: #004993;">MovieClip</span>
    <span style="color: #000000;">&#123;</span>
	<span style="color: #009900;">// we create our WebService object.  Remember to include &quot;?wsdl&quot; in the URL.</span>
	<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> wsMainService<span style="color: #000000; font-weight: bold;">:</span>WebService = <span style="color: #0033ff; font-weight: bold;">new</span> WebService<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;/Service.asmx?wsdl&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
                <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> FlashBitmapSave<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                        mcDrawingBoard.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">MOUSE_DOWN</span>, mcDrawingBoard_MouseDown<span style="color: #000000;">&#41;</span>;
			btnSaveToServer.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">CLICK</span>, btnSaveToServer_Click<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// the listener on our webservice will let us know if there's a problem with the webservice,</span>
			<span style="color: #009900;">// if the url is wrong, if the service is down, etc.</span>
			wsMainService.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>WebServiceEvent.INITFAILED, wsMainService_InitFailed<span style="color: #000000;">&#41;</span>;
                <span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #009900;">// **** functions for the drawing pad **** //</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> mcDrawingBoard_MouseDown<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			mcDrawingBoard.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">MOUSE_MOVE</span>, mcDrawingBoard_MouseMove<span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">stage</span>.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">MOUSE_UP</span>, stage_MouseUp<span style="color: #000000;">&#41;</span>;
			mcDrawingBoard.<span style="color: #004993;">graphics</span>.<span style="color: #004993;">moveTo</span><span style="color: #000000;">&#40;</span>mcDrawingBoard.<span style="color: #004993;">mouseX</span>, mcDrawingBoard.<span style="color: #004993;">mouseY</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> mcDrawingBoard_MouseMove<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			mcDrawingBoard.<span style="color: #004993;">graphics</span>.<span style="color: #004993;">lineStyle</span><span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight:bold;">1</span>, 0x000000<span style="color: #000000;">&#41;</span>;
			mcDrawingBoard.<span style="color: #004993;">graphics</span>.<span style="color: #004993;">lineTo</span><span style="color: #000000;">&#40;</span>mcDrawingBoard.<span style="color: #004993;">mouseX</span>, mcDrawingBoard.<span style="color: #004993;">mouseY</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> stage_MouseUp<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			mcDrawingBoard.<span style="color: #004993;">removeEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">MOUSE_MOVE</span>, mcDrawingBoard_MouseMove<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #009900;">// ************************************** //</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> btnSaveToServer_Click<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> bmdSnapshot<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">BitmapData</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">BitmapData</span><span style="color: #000000;">&#40;</span>mcDrawingBoard.<span style="color: #004993;">width</span>, mcDrawingBoard.<span style="color: #004993;">height</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #009900;">// take a snapshot of what was drawn in &quot;mcDrawingBoard&quot;</span>
			bmdSnapshot.<span style="color: #004993;">draw</span><span style="color: #000000;">&#40;</span>mcDrawingBoard<span style="color: #000000;">&#41;</span>;
&nbsp;
			saveImage<span style="color: #000000;">&#40;</span>bmdSnapshot<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> wsMainService_InitFailed<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span>WebServiceEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;Webservice failed to initialize.&quot;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> saveImage<span style="color: #000000;">&#40;</span>bmdSend<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">BitmapData</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">// create a new JPEGAsyncEncoder.  80 is the JPEG quality.</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> jpgEncoder<span style="color: #000000; font-weight: bold;">:</span>JPEGAsyncEncoder = <span style="color: #0033ff; font-weight: bold;">new</span> JPEGAsyncEncoder<span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight:bold;">80</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// encodes 400 pixels before sending out a ProgressEvent.  That means every 400 pixels the CPU has a chance to &quot;breath&quot;</span>
			<span style="color: #009900;">// and process some other code.  </span>
			jpgEncoder.PixelsPerIteration = <span style="color: #000000; font-weight:bold;">400</span>;
&nbsp;
			jpgEncoder.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>JPEGAsyncCompleteEvent.JPEGASYNC_COMPLETE, jpgEncoder_Complete<span style="color: #000000;">&#41;</span>;
			jpgEncoder.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ProgressEvent</span>.<span style="color: #004993;">PROGRESS</span>, jpgEncoder_Progress<span style="color: #000000;">&#41;</span>;
&nbsp;
			jpgEncoder.encode<span style="color: #000000;">&#40;</span>bmdSend<span style="color: #000000;">&#41;</span>;			
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> jpgEncoder_Complete<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span>JPEGAsyncCompleteEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> jpgByteArray<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ByteArray</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ByteArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #009900;">// put the raw image data we got back from the encoder into our ByteArray</span>
			jpgByteArray = e.ImageData;
&nbsp;
			sendToServer<span style="color: #000000;">&#40;</span>jpgByteArray<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> jpgEncoder_Progress<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ProgressEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;encoding... &quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">Math</span>.<span style="color: #004993;">round</span><span style="color: #000000;">&#40;</span>e.<span style="color: #004993;">bytesLoaded</span> <span style="color: #000000; font-weight: bold;">/</span> e.<span style="color: #004993;">bytesTotal</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight:bold;">100</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> sendToServer<span style="color: #000000;">&#40;</span>byteArray<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ByteArray</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> opJPEGSaver<span style="color: #000000; font-weight: bold;">:</span>Operation = <span style="color: #0033ff; font-weight: bold;">new</span> Operation<span style="color: #000000;">&#40;</span>wsMainService<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// unfortunately, I don't think the WebService class we're using has a working ProgressEvent.</span>
			<span style="color: #009900;">// if I'm wrong, please let me know!</span>
			opJPEGSaver.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>OperationEvent.<span style="color: #004993;">COMPLETE</span>, opJPEGSaver_Complete<span style="color: #000000;">&#41;</span>;
			opJPEGSaver.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>OperationEvent.FAILED, opJPEGSaver_Failed<span style="color: #000000;">&#41;</span>;	
&nbsp;
			<span style="color: #6699cc; font-weight: bold;">var</span> strEncodedString<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">String</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #009900;">// the Base64 class is static, so we can just call it using Base64.&lt;whatever&gt;</span>
			strEncodedString = Base64.encodeByteArray<span style="color: #000000;">&#40;</span>byteArray<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// send the encoded bytes to our webservice function we called &quot;SaveJPEG&quot;.</span>
			opJPEGSaver.SaveJPEG<span style="color: #000000;">&#40;</span>strEncodedString<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> opJPEGSaver_Complete<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span>OperationEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;ByteArray successfully sent to server.&quot;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> opJPEGSaver_Failed<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span>OperationEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;Error sending ByteArray to server.&quot;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>strLog<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">// my own way of tracing to the textfield txtTrace -- as you can see.</span>
			<span style="color: #009900;">// not an important part of anything going on here.</span>
			txtTrace.<span style="color: #004993;">appendText</span><span style="color: #000000;">&#40;</span>strLog <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;<span style="">\n</span>&quot;</span><span style="color: #000000;">&#41;</span>;
			traceScrollBar.scrollTarget = txtTrace;
			txtTrace.<span style="color: #004993;">scrollV</span> = txtTrace.<span style="color: #004993;">numLines</span>;
		<span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>




<h4>The VB.NET code:</h4>


<div class="wp_syntax"><div class="code"><pre class="vbnet" style="font-family:monospace;"><span style="color: #0600FF;">Imports</span> System.<span style="color: #0000FF;">Web</span>
<span style="color: #0600FF;">Imports</span> System.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">Services</span>
<span style="color: #0600FF;">Imports</span> System.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">Services</span>.<span style="color: #0000FF;">Protocols</span>
<span style="color: #0600FF;">Imports</span> System.<span style="color: #0000FF;">IO</span>
&nbsp;
<span style="color: #008080; font-style: italic;">' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.</span>
<span style="color: #008080; font-style: italic;">' &lt;System.Web.Script.Services.ScriptService()&gt; _</span>
&lt;WebService<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">Namespace</span>:<span style="color: #008000;">=</span><span style="color: #808080;">&quot;http://tempuri.org/&quot;</span><span style="color: #000000;">&#41;</span>&gt; _
&lt;WebServiceBinding<span style="color: #000000;">&#40;</span>ConformsTo:<span style="color: #008000;">=</span>WsiProfiles.<span style="color: #0000FF;">BasicProfile1_1</span><span style="color: #000000;">&#41;</span>&gt; _
&lt;Global.<span style="color: #0000FF;">Microsoft</span>.<span style="color: #0000FF;">VisualBasic</span>.<span style="color: #0000FF;">CompilerServices</span>.<span style="color: #0000FF;">DesignerGenerated</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>&gt; _
<span style="color: #FF8000;">Public</span> <span style="color: #0600FF;">Class</span> Service
     <span style="color: #0600FF;">Inherits</span> System.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">Services</span>.<span style="color: #0000FF;">WebService</span>
&nbsp;
&nbsp;
    &lt;WebMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>&gt; _
    <span style="color: #FF8000;">Public</span> <span style="color: #0600FF;">Function</span> SaveJPEG<span style="color: #000000;">&#40;</span><span style="color: #FF8000;">ByVal</span> strJPEG <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">String</span><span style="color: #000000;">&#41;</span> <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">String</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">'saves an uploaded photo and returns a unique name reference</span>
&nbsp;
        <span style="color: #0600FF;">Dim</span> BinaryContent <span style="color: #FF8000;">As</span> <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=</span> Convert.<span style="color: #0000FF;">FromBase64String</span><span style="color: #000000;">&#40;</span>strJPEG<span style="color: #000000;">&#41;</span>
&nbsp;
        <span style="color: #0600FF;">Try</span>
            <span style="color: #008080; font-style: italic;">'generate a unique name (GUID) for the filename</span>
            <span style="color: #0600FF;">Dim</span> strFileName <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">String</span> <span style="color: #008000;">=</span> System.<span style="color: #0000FF;">Guid</span>.<span style="color: #0000FF;">NewGuid</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;n&quot;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #008080; font-style: italic;">'MAKE SURE to change the save path!</span>
            <span style="color: #0600FF;">Dim</span> fStream <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">New</span> FileStream<span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;C:\&quot;</span> <span style="color: #008000;">+</span> strFileName <span style="color: #008000;">+</span> <span style="color: #808080;">&quot;.jpg&quot;</span>, FileMode.<span style="color: #0000FF;">CreateNew</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">Dim</span> bw <span style="color: #FF8000;">As</span> <span style="color: #FF8000;">New</span> BinaryWriter<span style="color: #000000;">&#40;</span>fStream<span style="color: #000000;">&#41;</span>
&nbsp;
            bw.<span style="color: #0600FF;">Write</span><span style="color: #000000;">&#40;</span>BinaryContent<span style="color: #000000;">&#41;</span>
            bw.<span style="color: #0600FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            fStream.<span style="color: #0600FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">'return the filename for use in Flash</span>
            <span style="color: #FF8000;">Return</span> strFileName
&nbsp;
        <span style="color: #0600FF;">Catch</span> ex <span style="color: #FF8000;">As</span> Exception
&nbsp;
            <span style="color: #FF8000;">Return</span> ex.<span style="color: #0000FF;">Message</span>
&nbsp;
        <span style="color: #0600FF;">End</span> <span style="color: #0600FF;">Try</span>
&nbsp;
    <span style="color: #0600FF;">End</span> <span style="color: #0600FF;">Function</span>
&nbsp;
<span style="color: #0600FF;">End</span> <span style="color: #0600FF;">Class</span></pre></div></div>


]]></content:encoded>
			<wfw:commentRss>http://ryanbosinger.com/blog/2008/saving-images-with-net/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
