Posting byte array to the server
16,652
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(MyUrl);
webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
webRequest.Method = "POST";
using (Stream requestStream = webRequest.GetRequestStream())
{
// write boundary bytes
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
// write header bytes.
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate, "MyName", "MyFileName", "content type");
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
requestStream.Write(headerbytes, 0, headerbytes.Length);
using (MemoryStream memoryStream = new MemoryStream(imageBytes))
{
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = memoryStream.Read(buffer, 0, buffer.Length)) != 0)
{
requestStream.Write(buffer, 0, bytesRead);
}
}
// write trailing boundary bytes.
byte[] trailerBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
requestStream.Write(trailerBytes, 0, trailerBytes.Length);
}
using (HttpWebResponse wr = (HttpWebResponse)webRequest.GetResponse())
{
using (Stream response = wr.GetResponseStream())
{
// handle response stream.
}
}
This reads a MemoryStream and writes the data to the requestStream, with a 4096 byte buffer. This should be wrapped in a try-catch so it can trap exceptions and handle them.
Related videos on Youtube
Author by
Alvin
Updated on August 26, 2022Comments
-
Alvin over 1 year
I am using POST to sent a byte array and a string to the server but is not sucessfull, am I doing the right thing?
memStream.Write(image, 0, signature.Length);, image is a byte array.
Code:
Uri wsHost = new Uri(WebServices.RESTEnpointAddress()); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(wsHost); request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); // Boundary var boundary = "------------------------" + DateTime.Now.Ticks.ToString("x"); // Set the request type request.ContentType = "multipart/form-data; boundary=" + boundary; request.Method = "POST"; request.KeepAlive = true; //request.ContentLength = docByte.Length; // Create a new memory stream Stream memStream = new MemoryStream(); // Boundary in bytes byte[] boundaryByte = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); // body memStream.Write(boundaryByte, 0, boundaryByte.Length); string ImgBody = string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n", "signImg", "tmpSignImgName"); ImgBody += "Content-Type: application/octet-stream\r\n\r\n"; byte[] ImgBodyByte = Encoding.ASCII.GetBytes(ImgBody); memStream.Write(ImgBodyByte, 0, ImgBodyByte.Length); memStream.Write(image, 0, signature.Length); // image ss a byte array memStream.Write(boundaryByte, 0, boundaryByte.Length); string signLocLatBody = string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n", "signloclat"); signLocLatBody += latitude; byte[] signLocLatBodyByte = Encoding.ASCII.GetBytes(signLocLatBody); memStream.Write(signLocLatBodyByte, 0, signLocLatBodyByte.Length); memStream.Write(boundaryByte, 0, boundaryByte.Length); Stream stream = request.GetRequestStream(); memStream.Position = 0; byte[] tempBuffer = new byte[memStream.Length]; memStream.Read(tempBuffer, 0, tempBuffer.Length); memStream.Close(); stream.Write(tempBuffer, 0, tempBuffer.Length); stream.Close();
-
L.B over 11 years
WebClient.UploadData
orWebClient.UploadFile
is simpler to use.
-
-
Marc Gravell over 11 yearsNo,
memStream
is the buffered data that the OP wants to copy tostream
-
Alvin over 11 yearsI am sending both byte array(image) and a string.