<?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>Brian Grinstead &#187; vb.net</title>
	<atom:link href="http://www.briangrinstead.com/blog/tag/vb-net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.briangrinstead.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 11 Jan 2012 20:23:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Multipart Form Post in C#</title>
		<link>http://www.briangrinstead.com/blog/multipart-form-post-in-c</link>
		<comments>http://www.briangrinstead.com/blog/multipart-form-post-in-c#comments</comments>
		<pubDate>Fri, 08 May 2009 14:58:07 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://www.briangrinstead.com/?p=119</guid>
		<description><![CDATA[I recently had to access a web API through C Sharp that required a file upload. This is pretty easy if you have an HTML page with a form tag and you want a user to directly upload the file. &#60;form method=&#34;POST&#34; action=&#34;http://localhost/&#34; enctype=&#34;multipart/form-data&#34;&#62; File : &#60;input type=&#34;file&#34; name=&#34;content&#34; size=&#34;38&#34; /&#62;&#60;br /&#62; &#60;input type=&#34;hidden&#34; name=&#34;id&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had to access a web API through C Sharp that required a file upload.  This is pretty easy if you have an HTML page with a form tag and you want a user to directly upload the file.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;form method=&quot;POST&quot; action=&quot;http://localhost/&quot; enctype=&quot;multipart/form-data&quot;&gt;
	File : &lt;input type=&quot;file&quot; name=&quot;content&quot; size=&quot;38&quot; /&gt;&lt;br /&gt;
	&lt;input type=&quot;hidden&quot; name=&quot;id&quot; value='fileUpload' /&gt;
 &lt;/form&gt;</pre></div></div>

<p>However, this is not always a reasonable path to take.  Sometimes you may be wanting to access a file that is already in a system and you don&#8217;t want a new upload.  If you are accessing an external API, this is probably always the case.  Unfortunately, building this post using C# is not quite as straightforward.  I first tried using the WebClient UploadFile method, but it didn&#8217;t fit my needs because I wanted to upload form values (id, filename, other API specific parameters) in addition to just a file.</p>
<p>So, I needed to roll my own form post.  Here is the <a href='http://www.ietf.org/rfc/rfc2388.txt'>Multipart Form RFC</a> and the <a href='http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2'>W3C Specification</a> for multipart/form data.  After reading these links and searching some <a href='http://stackoverflow.com/questions/219827/multipart-forms-from-c-client'>forums</a>, here is what I came up with.  </p>
<div class='update'>Update: This post has gotten a great response from all the readers who have taken the time to comment and contribute.  I would like to take this opportunity to promote <a href='http://restsharp.org/'>the best REST Client for .NET</a>, RestSharp.  John Sheehan has implemented this technique using code from this post, which can be seen <a href='https://github.com/johnsheehan/RestSharp/blob/master/RestSharp/Http.Sync.cs#L162'>on github</a> (just look for WriteMultipartFormData). He has also done a great job implementing other basic REST operations in a fully tested suite.  I would recommend reading the rest of the post to figure out what is going on behind the scenes, but you might consider using RestSharp in a production environment.  Thanks for reading!</div>
<p><ins>Note: If anyone is interested in this code in Visual Basic, reader Mike Ferreira <a href='#comment-1153'>converted the code into VB.Net</a> in a comment below.</ins></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">static</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">class</span> FormUpload
<span style="color: #008000;color: #000000;">&#123;</span>
	<span style="color: #0600FF; font-weight: bold;color: #0000FF;">private</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">static</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">readonly</span> Encoding encoding <span style="color: #008000;color: #000000;">=</span> Encoding<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">UTF8</span><span style="color: #008000;color: #000000;">;</span>
	<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">static</span> HttpWebResponse MultipartFormDataPost<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> postUrl, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> userAgent, Dictionary<span style="color: #008000;color: #000000;">&lt;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span>, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">object</span><span style="color: #008000;color: #000000;">&gt;</span> postParameters<span style="color: #008000;color: #000000;">&#41;</span>
	<span style="color: #008000;color: #000000;">&#123;</span>
		<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> formDataBoundary <span style="color: #008000;color: #000000;">=</span> <span style="color: #666666;color: #808080;">&quot;-----------------------------28947758029299&quot;</span><span style="color: #008000;color: #000000;">;</span>
		<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> contentType <span style="color: #008000;color: #000000;">=</span> <span style="color: #666666;color: #808080;">&quot;multipart/form-data; boundary=&quot;</span> <span style="color: #008000;color: #000000;">+</span> formDataBoundary<span style="color: #008000;color: #000000;">;</span>
&nbsp;
		<span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> formData <span style="color: #008000;color: #000000;">=</span> GetMultipartFormData<span style="color: #008000;color: #000000;">&#40;</span>postParameters, formDataBoundary<span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">return</span> PostForm<span style="color: #008000;color: #000000;">&#40;</span>postUrl, userAgent, contentType, formData<span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
	<span style="color: #008000;color: #000000;">&#125;</span>
	<span style="color: #0600FF; font-weight: bold;color: #0000FF;">private</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">static</span> HttpWebResponse PostForm<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> postUrl, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> userAgent, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> contentType, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> formData<span style="color: #008000;color: #000000;">&#41;</span>
	<span style="color: #008000;color: #000000;">&#123;</span>
		HttpWebRequest request <span style="color: #008000;color: #000000;">=</span> WebRequest<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;color: #000000;">&#40;</span>postUrl<span style="color: #008000;color: #000000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">as</span> HttpWebRequest<span style="color: #008000;color: #000000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">if</span> <span style="color: #008000;color: #000000;">&#40;</span>request <span style="color: #008000;color: #000000;">==</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">null</span><span style="color: #008000;color: #000000;">&#41;</span>
		<span style="color: #008000;color: #000000;">&#123;</span>
			<span style="color: #0600FF; font-weight: bold;color: #0000FF;">throw</span> <span style="color: #008000;color: #0000FF;">new</span> NullReferenceException<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;request is not a http request&quot;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
		<span style="color: #008000;color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;color: #008000;">// Set up the request properties</span>
		request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Method</span> <span style="color: #008000;color: #000000;">=</span> <span style="color: #666666;color: #808080;">&quot;POST&quot;</span><span style="color: #008000;color: #000000;">;</span>
		request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">ContentType</span> <span style="color: #008000;color: #000000;">=</span> contentType<span style="color: #008000;color: #000000;">;</span>
		request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">UserAgent</span> <span style="color: #008000;color: #000000;">=</span> userAgent<span style="color: #008000;color: #000000;">;</span>
		request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">CookieContainer</span> <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> CookieContainer<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
		request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">ContentLength</span> <span style="color: #008000;color: #000000;">=</span> formData<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">;</span>  <span style="color: #008080; font-style: italic;color: #008000;">// We need to count how many bytes we're sending. </span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">using</span> <span style="color: #008000;color: #000000;">&#40;</span>Stream requestStream <span style="color: #008000;color: #000000;">=</span> request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetRequestStream</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">&#41;</span>
		<span style="color: #008000;color: #000000;">&#123;</span>
			<span style="color: #008080; font-style: italic;color: #008000;">// Push it out there</span>
			requestStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>formData, <span style="color: #FF0000;color: #808080;">0</span>, formData<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
			requestStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
		<span style="color: #008000;color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">return</span> request<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetResponse</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">as</span> HttpWebResponse<span style="color: #008000;color: #000000;">;</span>
	<span style="color: #008000;color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF; font-weight: bold;color: #0000FF;">private</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">static</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> GetMultipartFormData<span style="color: #008000;color: #000000;">&#40;</span>Dictionary<span style="color: #008000;color: #000000;">&lt;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span>, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">object</span><span style="color: #008000;color: #000000;">&gt;</span> postParameters, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> boundary<span style="color: #008000;color: #000000;">&#41;</span>
	<span style="color: #008000;color: #000000;">&#123;</span>
		Stream formDataStream <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> <span style="color: #000000;">System.<span style="color: #0000FF;">IO</span></span><span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">MemoryStream</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">foreach</span> <span style="color: #008000;color: #000000;">&#40;</span>var param <span style="color: #0600FF; font-weight: bold;color: #0000FF;">in</span> postParameters<span style="color: #008000;color: #000000;">&#41;</span>
		<span style="color: #008000;color: #000000;">&#123;</span>
			<span style="color: #0600FF; font-weight: bold;color: #0000FF;">if</span> <span style="color: #008000;color: #000000;">&#40;</span>param<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Value</span> <span style="color: #008000;color: #0000FF;">is</span> FileParameter<span style="color: #008000;color: #000000;">&#41;</span>
			<span style="color: #008000;color: #000000;">&#123;</span>
				FileParameter fileToUpload <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #000000;">&#40;</span>FileParameter<span style="color: #008000;color: #000000;">&#41;</span>param<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
				<span style="color: #008080; font-style: italic;color: #008000;">// Add just the first part of this param, since we will write the file data directly to the Stream</span>
				<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> header <span style="color: #008000;color: #000000;">=</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span><span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;--{0}<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>Content-Disposition: form-data; name=<span style="color: #008080; font-weight: bold;color: #808080;">\&quot;</span>{1}<span style="color: #008080; font-weight: bold;color: #808080;">\&quot;</span>; filename=<span style="color: #008080; font-weight: bold;color: #808080;">\&quot;</span>{2}<span style="color: #008080; font-weight: bold;color: #808080;">\&quot;</span>;<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>Content-Type: {3}<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span><span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>&quot;</span>, 
					boundary, 
					param<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Key</span>, 
					fileToUpload<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">FileName</span> <span style="color: #008000;color: #000000;">??</span> param<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Key</span>, 
					fileToUpload<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">ContentType</span> <span style="color: #008000;color: #000000;">??</span> <span style="color: #666666;color: #808080;">&quot;application/octet-stream&quot;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
				formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>encoding<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;color: #000000;">&#40;</span>header<span style="color: #008000;color: #000000;">&#41;</span>, <span style="color: #FF0000;color: #808080;">0</span>, header<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
				<span style="color: #008080; font-style: italic;color: #008000;">// Write the file data directly to the Stream, rather than serializing it to a string.</span>
				formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>fileToUpload<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">File</span>, <span style="color: #FF0000;color: #808080;">0</span>, fileToUpload<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">File</span><span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
				<span style="color: #008080; font-style: italic;color: #008000;">// Thanks to feedback from commenters, add a CRLF to allow multiple files to be uploaded</span>
				formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>encoding<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>&quot;</span><span style="color: #008000;color: #000000;">&#41;</span>, <span style="color: #FF0000;color: #808080;">0</span>, <span style="color: #FF0000;color: #808080;">2</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
			<span style="color: #008000;color: #000000;">&#125;</span>
			<span style="color: #0600FF; font-weight: bold;color: #0000FF;">else</span>
			<span style="color: #008000;color: #000000;">&#123;</span>
				<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> postData <span style="color: #008000;color: #000000;">=</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span><span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;--{0}<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>Content-Disposition: form-data; name=<span style="color: #008080; font-weight: bold;color: #808080;">\&quot;</span>{1}<span style="color: #008080; font-weight: bold;color: #808080;">\&quot;</span><span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span><span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>{2}<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>&quot;</span>, 
					boundary, 
					param<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Key</span>, 
					param<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
				formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>encoding<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;color: #000000;">&#40;</span>postData<span style="color: #008000;color: #000000;">&#41;</span>, <span style="color: #FF0000;color: #808080;">0</span>, postData<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
			<span style="color: #008000;color: #000000;">&#125;</span>
		<span style="color: #008000;color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;color: #008000;">// Add the end of the request</span>
		<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> footer <span style="color: #008000;color: #000000;">=</span> <span style="color: #666666;color: #808080;">&quot;<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>--&quot;</span> <span style="color: #008000;color: #000000;">+</span> boundary <span style="color: #008000;color: #000000;">+</span> <span style="color: #666666;color: #808080;">&quot;--<span style="color: #008080; font-weight: bold;color: #808080;">\r</span><span style="color: #008080; font-weight: bold;color: #808080;">\n</span>&quot;</span><span style="color: #008000;color: #000000;">;</span>
		formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>encoding<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetBytes</span><span style="color: #008000;color: #000000;">&#40;</span>footer<span style="color: #008000;color: #000000;">&#41;</span>, <span style="color: #FF0000;color: #808080;">0</span>, footer<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;color: #008000;">// Dump the Stream into a byte[]</span>
		formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Position</span> <span style="color: #008000;color: #000000;">=</span> <span style="color: #FF0000;color: #808080;">0</span><span style="color: #008000;color: #000000;">;</span>
		<span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> formData <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span>formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#93;</span><span style="color: #008000;color: #000000;">;</span>
		formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;color: #000000;">&#40;</span>formData, <span style="color: #FF0000;color: #808080;">0</span>, formData<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
		formDataStream<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">return</span> formData<span style="color: #008000;color: #000000;">;</span>
	<span style="color: #008000;color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">class</span> FileParameter
	<span style="color: #008000;color: #000000;">&#123;</span>
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> File <span style="color: #008000;color: #000000;">&#123;</span> get<span style="color: #008000;color: #000000;">;</span> set<span style="color: #008000;color: #000000;">;</span> <span style="color: #008000;color: #000000;">&#125;</span>
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> FileName <span style="color: #008000;color: #000000;">&#123;</span> get<span style="color: #008000;color: #000000;">;</span> set<span style="color: #008000;color: #000000;">;</span> <span style="color: #008000;color: #000000;">&#125;</span>
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> ContentType <span style="color: #008000;color: #000000;">&#123;</span> get<span style="color: #008000;color: #000000;">;</span> set<span style="color: #008000;color: #000000;">;</span> <span style="color: #008000;color: #000000;">&#125;</span>
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> FileParameter<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> file<span style="color: #008000;color: #000000;">&#41;</span> <span style="color: #008000;color: #000000;">:</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">this</span><span style="color: #008000;color: #000000;">&#40;</span>file, <span style="color: #0600FF; font-weight: bold;color: #0000FF;">null</span><span style="color: #008000;color: #000000;">&#41;</span> <span style="color: #008000;color: #000000;">&#123;</span> <span style="color: #008000;color: #000000;">&#125;</span>
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> FileParameter<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> file, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> filename<span style="color: #008000;color: #000000;">&#41;</span> <span style="color: #008000;color: #000000;">:</span> <span style="color: #0600FF; font-weight: bold;color: #0000FF;">this</span><span style="color: #008000;color: #000000;">&#40;</span>file, filename, <span style="color: #0600FF; font-weight: bold;color: #0000FF;">null</span><span style="color: #008000;color: #000000;">&#41;</span> <span style="color: #008000;color: #000000;">&#123;</span> <span style="color: #008000;color: #000000;">&#125;</span>
		<span style="color: #0600FF; font-weight: bold;color: #0000FF;">public</span> FileParameter<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> file, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> filename, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> contenttype<span style="color: #008000;color: #000000;">&#41;</span> 
		<span style="color: #008000;color: #000000;">&#123;</span>
			File <span style="color: #008000;color: #000000;">=</span> file<span style="color: #008000;color: #000000;">;</span>
			FileName <span style="color: #008000;color: #000000;">=</span> filename<span style="color: #008000;color: #000000;">;</span>
			ContentType <span style="color: #008000;color: #000000;">=</span> contenttype<span style="color: #008000;color: #000000;">;</span>
		<span style="color: #008000;color: #000000;">&#125;</span>
	<span style="color: #008000;color: #000000;">&#125;</span>
<span style="color: #008000;color: #000000;">&#125;</span></pre></div></div>

<p>Here is the code to call the MultipartFormDataPost function with multiple parameters, including a file.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">&nbsp;
<span style="color: #008080; font-style: italic;color: #008000;">// Read file data</span>
FileStream fs <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> FileStream<span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;c:<span style="color: #008080; font-weight: bold;color: #808080;">\\</span>people.doc&quot;</span>, FileMode<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Open</span>, FileAccess<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
<span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span><span style="color: #008000;color: #000000;">&#93;</span> data <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> <span style="color: #6666cc; font-weight: bold;color: #0000FF;">byte</span><span style="color: #008000;color: #000000;">&#91;</span>fs<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#93;</span><span style="color: #008000;color: #000000;">;</span>
fs<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;color: #000000;">&#40;</span>data, <span style="color: #FF0000;color: #808080;">0</span>, data<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
fs<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;color: #008000;">// Generate post objects</span>
Dictionary<span style="color: #008000;color: #000000;">&lt;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span>, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">object</span><span style="color: #008000;color: #000000;">&gt;</span> postParameters <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> Dictionary<span style="color: #008000;color: #000000;">&lt;</span><span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span>, <span style="color: #6666cc; font-weight: bold;color: #0000FF;">object</span><span style="color: #008000;color: #000000;">&gt;</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
postParameters<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;filename&quot;</span>, <span style="color: #666666;color: #808080;">&quot;People.doc&quot;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
postParameters<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;fileformat&quot;</span>, <span style="color: #666666;color: #808080;">&quot;doc&quot;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
postParameters<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #666666;color: #808080;">&quot;file&quot;</span>, <span style="color: #008000;color: #0000FF;">new</span> FormUpload<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">FileParameter</span><span style="color: #008000;color: #000000;">&#40;</span>data, <span style="color: #666666;color: #808080;">&quot;People.doc&quot;</span>, <span style="color: #666666;color: #808080;">&quot;application/msword&quot;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;color: #008000;">// Create request and receive response</span>
<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> postURL <span style="color: #008000;color: #000000;">=</span> <span style="color: #666666;color: #808080;">&quot;http://localhost&quot;</span><span style="color: #008000;color: #000000;">;</span>
<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> userAgent <span style="color: #008000;color: #000000;">=</span> <span style="color: #666666;color: #808080;">&quot;Someone&quot;</span><span style="color: #008000;color: #000000;">;</span>
HttpWebResponse webResponse <span style="color: #008000;color: #000000;">=</span> FormUpload<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">MultipartFormDataPost</span><span style="color: #008000;color: #000000;">&#40;</span>postURL, userAgent, postParameters<span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;color: #008000;">// Process response</span>
StreamReader responseReader <span style="color: #008000;color: #000000;">=</span> <span style="color: #008000;color: #0000FF;">new</span> StreamReader<span style="color: #008000;color: #000000;">&#40;</span>webResponse<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">GetResponseStream</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
<span style="color: #6666cc; font-weight: bold;color: #0000FF;">string</span> fullResponse <span style="color: #008000;color: #000000;">=</span> responseReader<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">ReadToEnd</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
webResponse<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Close</span><span style="color: #008000;color: #000000;">&#40;</span><span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span>
Response<span style="color: #008000;color: #000000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;color: #000000;">&#40;</span>fullResponse<span style="color: #008000;color: #000000;">&#41;</span><span style="color: #008000;color: #000000;">;</span></pre></div></div>

<p>Hopefully this code can help someone, figuring out exactly where to place the boundary and newlines in between form key-value pairs caused a little bit of grief during development.  This is some functionality that would be really nice inside of the language library, but it seems like in most languages this is something you end up coding yourself.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.briangrinstead.com/blog/multipart-form-post-in-c/feed</wfw:commentRss>
		<slash:comments>62</slash:comments>
		</item>
	</channel>
</rss>

