using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; namespace nuget_cli { public class UploadFilesToServerUsingWebRequest { /// /// Creates HTTP POST request & uploads database to server. Author : Farhan Ghumra /// internal async Task UploadFilesToServerAsync(PushReport report, Uri uri, FileInfo fi, string apikey) { // string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; const int TXLEN = 0x1000; /// the form-data file upload, properly formatted string fileheaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\";\r\nContent-Type: {2}\r\n\r\n"; ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; // "X-NuGet-ApiKey string boundary = "----------" + DateTime.Now.Ticks.ToString("x"); byte[] boudaryByte = Encoding.ASCII.GetBytes(boundary); byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); string fileheader = string.Format(fileheaderTemplate, "file", fi.Name, "application/octet-stream"); byte[] fileheaderbytes = Encoding.ASCII.GetBytes(fileheader); HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri); httpWebRequest.Method = "PUT"; httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary; httpWebRequest.AllowAutoRedirect = false; httpWebRequest.Headers.Add("X-NuGet-Client-Version", Constants.ClientVersion); httpWebRequest.Headers.Add("X-NuGet-ApiKey", apikey); httpWebRequest.ContentLength = boudaryByte.Length + fileheaderbytes.Length + fi.Length + trailer.Length; httpWebRequest.BeginGetRequestStream((result) => { try { HttpWebRequest request = (HttpWebRequest)result.AsyncState; using (Stream requestStream = request.EndGetRequestStream(result)) { WriteToStream(requestStream, boudaryByte, boudaryByte.Length); WriteToStream(requestStream, fileheaderbytes, fileheaderbytes.Length); // WriteToStream(s, string.Format(fileheaderlentemplate, fi.Length)); /// Write the file data to the stream. using (var fss = fi.OpenRead()) { byte[] buffer = new byte[TXLEN]; var form_bytes_read = fss.Read(buffer, 0, TXLEN); while (form_bytes_read > 0) { WriteToStream(requestStream, buffer, form_bytes_read); form_bytes_read = fss.Read(buffer, 0, TXLEN); } } requestStream.Write(trailer, 0, trailer.Length); //requestStream.Close(); } request.BeginGetResponse(a => { try { var response = request.EndGetResponse(a); var responseStream = response.GetResponseStream(); using (var sr = new StreamReader(responseStream)) { using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) { string responseString = streamReader.ReadToEnd(); //responseString is depend upon your web service. if (responseString == "Success") { report.Message = "stored successfully on server."; } else { report.Message = "Error occurred while uploading packet on server."; } } } } catch (Exception ex) { report.Message = ex.Message; Console.Error.WriteLine(ex.Message); #if DEBUG Console.Error.WriteLine("Stack trace:"); Console.Error.WriteLine(ex.StackTrace); #endif } }, null); } catch (Exception rex) { report.Message = rex.Message; Console.Error.WriteLine(rex.Message); #if DEBUG Console.Error.WriteLine("Stack trace:"); Console.Error.WriteLine(rex.StackTrace); #endif } }, httpWebRequest); WebResponse resp = httpWebRequest.GetResponse(); Stream stream = resp.GetResponseStream(); StreamReader re = new StreamReader(stream); String json = re.ReadToEnd(); report.Message = json; } /// /// Writes string to stream. Author : Farhan Ghumra /// private static void WriteToStream(Stream s, string txt) { byte[] bytes = Encoding.UTF8.GetBytes(txt); s.Write(bytes, 0, bytes.Length); } /// /// Writes byte array to stream. Author : Farhan Ghumra /// private static void WriteToStream(Stream s, byte[] bytes, int len) { s.Write(bytes, 0, len); } } }