С# отправить изображение через HTTP
У меня есть небольшой HTTP-сервер, написанный на С#, и до сих пор мне только нужно было отправить исходный текст обратно отправителю. Но теперь я должен отправить JPG-изображение, и я не понимаю, как это сделать.
это то, что у меня есть сейчас:
// Read the HTTP Request
Byte[] bReceive = new Byte[MAXBUFFERSIZE];
int i = socket.Receive(bReceive, bReceive.Length, 0);
//Convert Byte to String
string sBuffer = Encoding.ASCII.GetString(bReceive);
// Look for HTTP request
iStartPos = sBuffer.IndexOf("HTTP", 1);
// Extract the Command without GET_/ at the beginning and _HTTP at the end
sRequest = sBuffer.Substring(5, iStartPos - 1 - 5);
String answer = handleRequest(sRequest);
// Send the response
socket.Send(Encoding.UTF8.GetBytes(answer));
Я думаю, что я должен сделать какой-то филе вместо строки, но у меня действительно нет клея.
Ответы
Ответ 1
Вы хотите отправить файл или объект Bitmap?
MemoryStream myMemoryStream = new MemoryStream();
myImage.Save(myMemoryStream);
myMemoryStream.Position = 0;
ИЗМЕНИТЬ
// Send the response
SendVarData(socket,memoryStream.ToArray());
для отправки MemoryStream через сокет вы можете использовать этот метод, указанный здесь
private static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
Ответ 2
Почему вы создали httpserver самостоятельно? Почему бы не использовать открытый исходный код? Например, my: http://webserver.codeplex.com
public class Example
{
private HttpListener _listener;
public void StartTutorial()
{
_listener = HttpListener.Create(IPAddress.Any, 8081);
_listener.RequestReceived += OnRequest;
_listener.Start(5);
}
private void OnRequest(object source, RequestEventArgs args)
{
IHttpClientContext context = (IHttpClientContext)source;
IHttpRequest request = args.Request;
IHttpResponse response = request.CreateResponse(context);
response.Body = new FileStream("Path\\to\\file.jpg");
response.ContentType = "image\jpeg";
response.Send();
}
}
Edit
Если вы действительно хотите сделать это самостоятельно:
string responseHeaders = "HTTP/1.1 200 The file is coming right up!\r\n" +
"Server: MyOwnServer\r\n" +
"Content-Length: " + new FileInfo("C:\\image.jpg").Length + "\r\n" +
"Content-Type: image/jpeg\r\n" +
"Content-Disposition: inline;filename=\"image.jpg;\"\r\n" +
"\r\n";
//headers should ALWAYS be ascii. Never UTF8
var headers = Encoding.ASCII.GetBytes(responseHeaders);
socket.Send(headers, 0, headers.Length);
socket.SendFile("C:\\image.jpg");