Hey, ich versuche gerade, eine Bilddatei mit einer Web-Anfrage, einem Speicher-Stream und einem Bild-Objekt an einen Webserver zu senden.C# Bild-Objekt in Web-Anforderung lesen
Dies ist meine aktuelle Methode zum Senden der Anfrage:
public void Send(Image image)
{
//Assign the request here too, just in case
Request = (HttpWebRequest)WebRequest.Create(FormURL);
Request.Method = "POST";
Request.ContentType = "multipart/form-data; boundary=" + CONTENT_BOUNDARY;
Request.Headers.Add("Cache-Control", "no-cache");
Request.KeepAlive = true;
Request.ContentLength = GetFormElements().Length +
GetFileHeader(FileName).Length +
FILE_TRAIL.Length +
ConvertImageToByteArray(image).Length;
//Must be done in this order for stream to write properly:
//----
//Form elements
//File header
//Image
//File trailer
//----
WriteStringToStream(FileStream, GetFormElements());
WriteStringToStream(FileStream, GetFileHeader(FileName));
WriteImageToStream(FileStream, image);
WriteStringToStream(FileStream, FILE_TRAIL);
string PostData = ASCIIEncoding.ASCII.GetString(ConvertImageToByteArray(image));
StreamWriter SW = new StreamWriter(Request.GetRequestStream(), Encoding.ASCII);
SW.Write(PostData);
GetRequestResponse();
Console.WriteLine(Request.HaveResponse);
FileStream.Close();
Request = null;
}
Das Problem, das ich habe ist, dass ich überhaupt keine Antwort vom Server erhalten, trotz des Stromes zu sein, was ein sein aussehen korrekte Länge (I entfernt einige Debug-Ausgaben aus dem Code oben)
Falls nötig, kann ich andere Teile meiner Klasse schreiben, aber jetzt sind hier die Schreibfunktionen:
WriteStringToStream:
private void WriteStringToStream(System.IO.MemoryStream stream, string String)
{
byte[] PostData = System.Text.Encoding.ASCII.GetBytes(String);
stream.Write(PostData, 0, PostData.Length);
}
WriteImageToSteam:
private void WriteImageToStream(System.IO.MemoryStream Stream, Image img)
{
Stream.Write(ConvertImageToByteArray(img), 0, ConvertImageToByteArray(img).Length);
}
ConvertImageToByteArray:
private Byte[] ConvertImageToByteArray(Image img)
{
//Method taken from http://www.csharp-station.com/Articles/Thumbnails.aspx and adapted
MemoryStream memStream = new MemoryStream();
img.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] byteArray = new Byte[memStream.Length];
memStream.Position = 0;
memStream.Read(byteArray, 0, (int)memStream.Length);
return byteArray;
}
In ConvertImageToByteArray können Sie memStream.ToArray zurückkehren wite(); anstatt ein Array zu deklarieren und den Stream darin einzulesen. – SLaks
Welcher Code ist in GetRequestResponse? – SLaks
In WriteImageToStream sollten Sie ConvertImageToByteArray nicht zweimal aufrufen - es wird ziemlich langsam sein. Deklarieren Sie stattdessen ein Bytearray und lesen Sie seine Length-Eigenschaft – SLaks