Reputation: 13
I'm working on a file upload from a c# web app, going from the client machine to a remote cloud host. The user types in the file name and location and passes that to the server. I am streaming the contents of the file in chunks to the request. However, the file is not valid when it gets to the destination. I'm sure it's somehow related to my request headers and junk like that, since I'm able to make this work when uploading from the server to the remote location. Can anyone spot what's wrong?
while (bytesRemaining > 0)
{
if (!sw.CanRead)
{
sw = File.OpenRead(txtFileUpload.Text);
if (offset > 0)
sw.Seek(offset, SeekOrigin.Begin);
}
int count = sw.Read(buffer, 0, (int) chunk);
request =
(HttpWebRequest)
WebRequest.Create("http://xxxxxx.com/write/" +
offset);
request.Method = "POST";
request.ReadWriteTimeout = int.MaxValue;
request.Timeout = int.MaxValue;
request.KeepAlive = false;
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary=" + boundary;
var postData = new MemoryStream();
const string newLine = "\r\n";
var sw3 = new StreamWriter(postData);
sw3.Write("--" + boundary + newLine);
sw3.Write("Content-Disposition: form-data;name=\"{0}\";filename=\"{1}\"{2}", "upload",
txtFileName.Text, newLine);
sw3.Write("Content-Type: multipart/form-data " + newLine + newLine);
sw3.Flush();
postData.Write(buffer, 0, count);
sw3.Write(newLine);
sw3.Write("--{0}--{1}", boundary, newLine);
sw3.Flush();
request.ContentLength = postData.Length;
using (Stream s = request.GetRequestStream())
postData.WriteTo(s);
sw3.Write("--" + boundary + newLine);
sw3.Write("Content-Disposition: form-data;name=\"\"" + newLine);
sw3.Write("content-type:octet-stream;charset=windows-1250" + newLine);
sw3.Write("VALUE" + newLine);
sw3.Write("--{0}--{1}", boundary, newLine);
sw3.Flush();
postData.Close();
// These next 3 lines are what I had before, instead of all the previous
// code, which worked when uploading a file from the server to the remote
// location.
//using (Stream sw2 = request.GetRequestStream())
//{
// sw2.Write(buffer, 0, count);
//}
using (WebResponse resp = request.GetResponse())
{
resp.Close();
}
offset += count;
bytesRemaining -= count;
}
Upvotes: 0
Views: 1765
Reputation: 24403
Why reinvent the wheel ? Use
WebClient.UploadFile
http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadfile(v=vs.71).aspx
They even have an example.
Upvotes: 1