Send a file via HTTP POST with C#

Viewed 299579

I've been searching and reading around to that and couldn't fine anything really useful.

I'm writing an small C# win app that allows user to send files to a web server, not by FTP, but by HTTP using POST. Think of it like a web form but running on a windows application.

I have my HttpWebRequest object created using something like this

HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest 

and also set the Method, ContentType and ContentLength properties. But thats the far I can go.

This is my piece of code:

HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest;
req.KeepAlive = false;
req.Method = "POST";
req.Credentials = new NetworkCredential(user.UserName, user.UserPassword);
req.PreAuthenticate = true;
req.ContentType = file.ContentType;
req.ContentLength = file.Length;
HttpWebResponse response = null;

try
{
    response = req.GetResponse() as HttpWebResponse;
}
catch (Exception e) 
{
}

So my question is basically how can I send a fie (text file, image, audio, etc) with C# via HTTP POST.

Thanks!

9 Answers

To send the raw file only:

using(WebClient client = new WebClient()) {
    client.UploadFile(address, filePath);
}

If you want to emulate a browser form with an <input type="file"/>, then that is harder. See this answer for a multipart/form-data answer.

You need to write your file to the request stream:

using (var reqStream = req.GetRequestStream()) 
{    
    reqStream.Write( ... ) // write the bytes of the file
}

You can do it directly with HttpWebRequest/HttpWebResponse like this.

        string serviceUrl = string.Format("{0}/upload?param={1}", "http://127.0.0.1:8080", HttpUtility.UrlEncode(parameter));
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl);
        request.Method = "POST";
        request.KeepAlive = true;
        
        FileStream file = File.OpenRead(pathToFile);
        request.ContentLength = file.Length;

        file.Seek(0, SeekOrigin.Begin);
        file.CopyTo(request.GetRequestStream());

        HttpWebResponse response = (request.GetResponse() as HttpWebResponse);
        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        string responseText = reader.ReadToEnd();
Related