424,279 Members | 1,907 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,279 IT Pros & Developers. It's quick & easy.

how to upload file via c# code

P: n/a
Hi,

I have a simple web page that allow file to be uploaded, the upload page
looks like the following:

<form method="post" name="upload" enctype="multipart/form-data"
action="processupload.aspx">
<input type=checkbox name="chkOverride" value="1">
<input type=file name="filename">
<input type=submit value="Upload Data File" name="cmdSubmit">
</form>

My question is without using the web page, how could I use something in
System.Net such as HttpWebRequest or WebClient or some kind to
programmatically upload a file along with sending the checkbox to that
upload page?

Thanks very much!
John
Nov 17 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Hi, Steven,

I know how to write that code!!!
I am talking about how to write code to interact with that upload page
programatically - not on server side.

Thanks!
John
"Steven Cheng[MSFT]" <v-******@online.microsoft.com> wrote in message
news:a6****************@TK2MSFTNGXA02.phx.gbl...
Hi John,

Welcome to MSDN newsgroup.
As for the uploading file programmatically through Httpwebrequest or
webclient, I think both of them are OK. And webclient's uploaddata or
upload method is just using the httpwebrequest internally. Also, the
HttpWebRequest or webclient just send http post request to the target
document( page ). So your page's code logically is better to be something
like:

private void Page_Load(object sender, System.EventArgs e)
{

foreach(string key in Request.Files.Keys)
{
HttpPostedFile file = Request.Files.Get(key);
string fn = Path.GetFileNameWithoutExtension(file.FileName) +
DateTime.Now.Millisecond + Path.GetExtension(file.FileName);

file.SaveAs(Server.MapPath("./temp/" + fn));

Response.Write("<br>" + fn + " is uploaded!");

}

}

Then, our client side can use httpwebrequest/ webclient to post filestream
to that page. here are some tech article discussing on this:

http://www.c-sharpcorner.com/Code/20...DotNetBugs.asp

http://www.thecodeproject.com/csharp/UploadFileEx.asp

Also, I've attached a demo application which use HTTPWebRequest to upload
multi-files, you can also have a look if you have interesting ;-).

Hope helps.

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

Nov 17 '05 #2

P: n/a
Thanks for your reply John,

As for how to programmatically interact with the upload page in client .net
application, have you had a chance to see the code in the article I
provided or my attached demo? I'm sorry for my carelessness since I
assumed that you'll have a look at those article or my demo. Anyway, here
are some code snippet on using webclient or httpwebrequest to post file
stream:

#using WebClient
string url = "http://myserver/myapp/upload.aspx";
string file = "c:\\files\\test.jpg";
WebClient wc = new WebClient();
wc.UploadFile(url,"post",file);

#using httpWebrequest:
private void UploadFilesToRemoteUrl(string url, string[] files, string
logpath)
{

long length = 0;
string boundary = "----------------------------" +
DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
httpWebRequest2.Method = "POST";
httpWebRequest2.KeepAlive = true;

httpWebRequest2.Credentials =
System.Net.CredentialCache.DefaultCredentials;

Stream memStream = new System.IO.MemoryStream();

byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
boundary + "\r\n");
memStream.Write(boundarybytes,0,boundarybytes.Leng th);
length += boundarybytes.Length;

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\";
filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";

for(int i=0;i<files.Length;i++)
{

string header = string.Format(headerTemplate,"file"+i,files[i]);

byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);

memStream.Write(headerbytes,0,headerbytes.Length);
length += headerbytes.Length;

FileStream fileStream = new FileStream(files[i], FileMode.Open,
FileAccess.Read);
byte[] buffer = new byte[1024];

int bytesRead = 0;

while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
{
memStream.Write(buffer, 0, bytesRead);
length += bytesRead;
}
memStream.Write(boundarybytes,0,boundarybytes.Leng th);
length += boundarybytes.Length;

fileStream.Close();
}

httpWebRequest2.ContentLength = memStream.Length;

Stream requestStream = httpWebRequest2.GetRequestStream();

memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer,0,tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer,0,tempBuffer.Length );
requestStream.Close();
WebResponse webResponse2 = httpWebRequest2.GetResponse();

Stream stream2 = webResponse2.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
MessageBox.Show(reader2.ReadToEnd());

webResponse2.Close();
httpWebRequest2 = null;
webResponse2 = null;

}
As we can see, weclient has encapsulated the underlying details of using
httpwebrequest to post data and the code will be very simple. However,
using httpwebrequest directly will give us more control over the posted
data stream as my above function inject multi file stream into the single
HttP request message.

Hope helps.

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
Nov 17 '05 #3

P: n/a
Thanks very much, Steven!!!

That's exactly what I am looking for - one more thing, the code snippet
shows how to upload the file only, I need to know how to upload the file
PLUS post extra form field back, Could you please help me on that? Thanks a
lot!

Regards,
John

"Steven Cheng[MSFT]" <v-******@online.microsoft.com> wrote in message
news:yY**************@TK2MSFTNGXA02.phx.gbl...
Thanks for your reply John,

As for how to programmatically interact with the upload page in client
.net
application, have you had a chance to see the code in the article I
provided or my attached demo? I'm sorry for my carelessness since I
assumed that you'll have a look at those article or my demo. Anyway, here
are some code snippet on using webclient or httpwebrequest to post file
stream:

#using WebClient
string url = "http://myserver/myapp/upload.aspx";
string file = "c:\\files\\test.jpg";
WebClient wc = new WebClient();
wc.UploadFile(url,"post",file);

#using httpWebrequest:
private void UploadFilesToRemoteUrl(string url, string[] files, string
logpath)
{

long length = 0;
string boundary = "----------------------------" +
DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
httpWebRequest2.Method = "POST";
httpWebRequest2.KeepAlive = true;

httpWebRequest2.Credentials =
System.Net.CredentialCache.DefaultCredentials;

Stream memStream = new System.IO.MemoryStream();

byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
boundary + "\r\n");
memStream.Write(boundarybytes,0,boundarybytes.Leng th);
length += boundarybytes.Length;

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\";
filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";

for(int i=0;i<files.Length;i++)
{

string header = string.Format(headerTemplate,"file"+i,files[i]);

byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);

memStream.Write(headerbytes,0,headerbytes.Length);
length += headerbytes.Length;

FileStream fileStream = new FileStream(files[i], FileMode.Open,
FileAccess.Read);
byte[] buffer = new byte[1024];

int bytesRead = 0;

while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
{
memStream.Write(buffer, 0, bytesRead);
length += bytesRead;
}
memStream.Write(boundarybytes,0,boundarybytes.Leng th);
length += boundarybytes.Length;

fileStream.Close();
}

httpWebRequest2.ContentLength = memStream.Length;

Stream requestStream = httpWebRequest2.GetRequestStream();

memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer,0,tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer,0,tempBuffer.Length );
requestStream.Close();
WebResponse webResponse2 = httpWebRequest2.GetResponse();

Stream stream2 = webResponse2.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
MessageBox.Show(reader2.ReadToEnd());

webResponse2.Close();
httpWebRequest2 = null;
webResponse2 = null;

}
As we can see, weclient has encapsulated the underlying details of using
httpwebrequest to post data and the code will be very simple. However,
using httpwebrequest directly will give us more control over the posted
data stream as my above function inject multi file stream into the single
HttP request message.

Hope helps.

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

Nov 17 '05 #4

P: n/a
Hi John,

Glad that it is of assistance. As for post extra form fields together with
filestream, we can just add some additional sections into the request's
stream. Here is the modified "UploadFilesToRemoteUrl" method which contains
an additioal NameValueCollection parameter to specify the form datas we
want to post.

Hope helps. Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

====================================

private void UploadFilesToRemoteUrl(string url, string[] files, string
logpath, NameValueCollection nvc)
{

long length = 0;
string boundary = "----------------------------" +
DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest2.ContentType = "multipart/form-data; boundary=" +
boundary;
httpWebRequest2.Method = "POST";
httpWebRequest2.KeepAlive = true;
httpWebRequest2.Credentials =
System.Net.CredentialCache.DefaultCredentials;

Stream memStream = new System.IO.MemoryStream();

byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
boundary + "\r\n");
string formdataTemplate = "\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

foreach(string key in nvc.Keys)
{
string formitem = string.Format(formdataTemplate, key, nvc[key]);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
memStream.Write(formitembytes, 0, formitembytes.Length);
}
memStream.Write(boundarybytes,0,boundarybytes.Leng th);

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\";
filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";

for(int i=0;i<files.Length;i++)
{

string header = string.Format(headerTemplate,"file"+i,files[i]);

byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);

memStream.Write(headerbytes,0,headerbytes.Length);
FileStream fileStream = new FileStream(files[i], FileMode.Open,
FileAccess.Read);
byte[] buffer = new byte[1024];

int bytesRead = 0;

while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
{
memStream.Write(buffer, 0, bytesRead);

}
memStream.Write(boundarybytes,0,boundarybytes.Leng th);
fileStream.Close();
}

httpWebRequest2.ContentLength = memStream.Length;

Stream requestStream = httpWebRequest2.GetRequestStream();

memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer,0,tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer,0,tempBuffer.Length );
requestStream.Close();
WebResponse webResponse2 = httpWebRequest2.GetResponse();

Stream stream2 = webResponse2.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
MessageBox.Show(reader2.ReadToEnd());

webResponse2.Close();
httpWebRequest2 = null;
webResponse2 = null;

}
============================

Nov 17 '05 #5

P: n/a
Hi John,

Glad that it is of assistance. As for post extra form fields together with
filestream, we can just add some additional sections into the request's
stream. Here is the modified "UploadFilesToRemoteUrl" method which contains
an additioal NameValueCollection parameter to specify the form datas we
want to post.

Hope helps. Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

====================================

private void UploadFilesToRemoteUrl(string url, string[] files, string
logpath, NameValueCollection nvc)
{

long length = 0;
string boundary = "----------------------------" +
DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest2.ContentType = "multipart/form-data; boundary=" +
boundary;
httpWebRequest2.Method = "POST";
httpWebRequest2.KeepAlive = true;
httpWebRequest2.Credentials =
System.Net.CredentialCache.DefaultCredentials;

Stream memStream = new System.IO.MemoryStream();

byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
boundary + "\r\n");
string formdataTemplate = "\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

foreach(string key in nvc.Keys)
{
string formitem = string.Format(formdataTemplate, key, nvc[key]);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
memStream.Write(formitembytes, 0, formitembytes.Length);
}
memStream.Write(boundarybytes,0,boundarybytes.Leng th);

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\";
filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";

for(int i=0;i<files.Length;i++)
{

string header = string.Format(headerTemplate,"file"+i,files[i]);

byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);

memStream.Write(headerbytes,0,headerbytes.Length);
FileStream fileStream = new FileStream(files[i], FileMode.Open,
FileAccess.Read);
byte[] buffer = new byte[1024];

int bytesRead = 0;

while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
{
memStream.Write(buffer, 0, bytesRead);

}
memStream.Write(boundarybytes,0,boundarybytes.Leng th);
fileStream.Close();
}

httpWebRequest2.ContentLength = memStream.Length;

Stream requestStream = httpWebRequest2.GetRequestStream();

memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer,0,tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer,0,tempBuffer.Length );
requestStream.Close();
WebResponse webResponse2 = httpWebRequest2.GetResponse();

Stream stream2 = webResponse2.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
MessageBox.Show(reader2.ReadToEnd());

webResponse2.Close();
httpWebRequest2 = null;
webResponse2 = null;

}
============================

Nov 17 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.