user756678
user756678

Reputation: 13

Stream file from client to webrequest

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

Answers (1)

parapura rajkumar
parapura rajkumar

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

Related Questions