Your handler is expecting a
multipart/formdata[
^] request, but your code is simply sending the raw bytes of the file.
You need to build a proper request to transmit the file:
public static class Extensions
{
public static void PrepareFileUpload(this WebRequest request, string fieldName, Stream fileStream, string fileName, string contentType)
{
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Method = "POST";
using (var stream = request.GetRequestStream())
using (var writer = new StreamWriter(stream, System.Text.Encoding.ASCII))
{
writer.WriteLine();
writer.WriteLine("--{0}", boundary);
writer.WriteLine("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"", fieldName, fileName);
writer.WriteLine("Content-Type: {0}", contentType);
writer.WriteLine();
writer.Flush();
fileStream.CopyTo(stream);
writer.WriteLine();
writer.WriteLine("--{0}--", boundary);
}
}
}
...
var httpRequest = WebRequest.Create(UPLOADER_URI);
httpRequest.PrepareFileUpload("fieldName", stream, "MyFile.csv", "text/csv");
using (var response = httpRequest.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
var responseString = reader.ReadToEnd();
lblMsg.Text = "Posted to server. Response is : " + responseString;
}
Alternatively, if you're always uploading a file stored on server A's file system, you can use
the WebClient class[
^]:
using (var client = new WebClient())
{
byte[] response = client.UploadFile(UPLOADER_URI, FILE_PATH);
string responseString = Encoding.UTF8.GetString(response);
lblMsg.Text = "Posted to server. Response is : " + responseString;
}
Or, if you're using .NET 4.0 or higher, you can use
the HttpClient class[
^]:
private static readonly HttpClient Client = new HttpClient();
...
using (var content = new MultipartFormDataContent())
{
content.Add(new StreamContent(stream), "fieldName", "MyFile.csv");
using (var response = await Client.PostAsync(UPLOADER_URI, content))
{
response.EnsureSuccessStatusCode();
string responseString = await response.Content.ReadAsStringAsync();
lblMsg.Text = "Posted to server. Response is : " + responseString;
}
}
NB: You'll need to make your code
async
to use this.