Upload file through c# using JSON request and RestSharp
This was a fight... In the end I discovered two different ways of solving this problem. The irony of it, as so many of coding problems, was that all i had to do was setting the right parameters in first place...Just one missing parameter cost me more than 4 hours..
Both detailed below :
1 - Use RestSharp (the total field shouldn't be there, and the ispaperduplicate field was missing)
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using RestSharp;using System.Web.Script.Serialization;using System.IO;using System.Net;namespace RonRestClient{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string path = @"C:\filename2.pdf"; //localhost settings string requestHost = @"http://localhost:3000/receipts"; string tagnr = "p94tt7w"; string machinenr = "2803433"; string safe_token = "123"; // Do it with RestSharp templateRequest req = new templateRequest(); req.receipt = new templateRequest.Receipt(tagnr); req.machine = new templateRequest.Machine(machinenr, safe_token); var request = new RestRequest("/receipts", Method.POST); request.AddParameter("receipt[tag_number]", tagnr); request.AddParameter("receipt[ispaperduplicate]", 0); request.AddParameter("machine[serial_number]", machinenr); request.AddParameter("machine[safe_token]", safe_token); request.AddFile("receipt[receipt_file]", File.ReadAllBytes(path), Path.GetFileName(path), "application/octet-stream"); // Add HTTP Headers request.AddHeader("Content-type", "application/json"); request.AddHeader("Accept", "application/json"); request.RequestFormat = DataFormat.Json; //set request Body //request.AddBody(req); // execute the request //calling server with restClient RestClient restClient = new RestClient("http://localhost:3000"); restClient.ExecuteAsync(request, (response) => { if (response.StatusCode == HttpStatusCode.OK) { //upload successfull MessageBox.Show("Upload completed succesfully...\n" + response.Content); } else { //error ocured during upload MessageBox.Show(response.StatusCode + "\n" + response.StatusDescription); } }); } }}
2 - Use FileStream with HttpWebRequest (thank you Clivant)
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using RestSharp;using System.Web.Script.Serialization;using System.IO;using System.Net;namespace RonRestClient{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string path = @"C:\Projectos\My Training Samples\Adobe Sample\RBO1574.pdf"; //localhost settings string requestHost = @"http://localhost:3000/receipts"; string tagnr = "p94tt7w"; string machinenr = "2803433"; string safe_token = "123"; FileStream fs1 = File.OpenRead(path); long filesize = fs1.Length; fs1.Close(); // Create a http request to the server endpoint that will pick up the // file and file description. HttpWebRequest requestToServerEndpoint = (HttpWebRequest)WebRequest.Create(requestHost); string boundaryString = "FFF3F395A90B452BB8BEDC878DDBD152"; string fileUrl = path; // Set the http request header \\ requestToServerEndpoint.Method = WebRequestMethods.Http.Post; requestToServerEndpoint.ContentType = "multipart/form-data; boundary=" + boundaryString; requestToServerEndpoint.KeepAlive = true; requestToServerEndpoint.Credentials = System.Net.CredentialCache.DefaultCredentials; requestToServerEndpoint.Accept = "application/json"; // Use a MemoryStream to form the post data request, // so that we can get the content-length attribute. MemoryStream postDataStream = new MemoryStream(); StreamWriter postDataWriter = new StreamWriter(postDataStream); // Include value from the tag_number text area in the post data postDataWriter.Write("\r\n--" + boundaryString + "\r\n"); postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", "receipt[tag_number]", tagnr); // Include ispaperduplicate text area in the post data postDataWriter.Write("\r\n--" + boundaryString + "\r\n"); postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", "receipt[ispaperduplicate]", 0); // Include value from the machine number in the post data postDataWriter.Write("\r\n--" + boundaryString + "\r\n"); postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", "machine[serial_number]", machinenr); // Include value from the machine token in the post data postDataWriter.Write("\r\n--" + boundaryString + "\r\n"); postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", "machine[safe_token]", safe_token); // Include the file in the post data postDataWriter.Write("\r\n--" + boundaryString + "\r\n"); postDataWriter.Write("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Length: \"{2}\"\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n", "receipt[receipt_file]", Path.GetFileName(fileUrl), filesize); postDataWriter.Flush(); // Read the file FileStream fileStream = new FileStream(fileUrl, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { postDataStream.Write(buffer, 0, bytesRead); } fileStream.Close(); postDataWriter.Write("\r\n--" + boundaryString + "--\r\n"); postDataWriter.Flush(); // Set the http request body content length requestToServerEndpoint.ContentLength = postDataStream.Length; // Dump the post data from the memory stream to the request stream Stream s = requestToServerEndpoint.GetRequestStream(); postDataStream.WriteTo(s); postDataStream.Close(); } }}