C # отправить изображение по HTTP - PullRequest
15 голосов
/ 11 ноября 2010

У меня есть небольшой HTTP-сервер, написанный на C #, и до сих пор мне нужно было только отправить исходный текст отправителю. Но теперь мне нужно отправить 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));

Я думаю, что мне нужно сделать какой-то поток файлов вместо строки, но у меня действительно нет клея ..

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Почему вы сами создали http-сервер? Почему бы не использовать один с открытым исходным кодом? Например мой: 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();
    }

}

Редактировать

Если вы действительно хотите сделать это самостоятельно:

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");
2 голосов
/ 11 ноября 2010

Хотите отправить из файла или растрового объекта?

MemoryStream myMemoryStream = new MemoryStream();
myImage.Save(myMemoryStream);
myMemoryStream.Position = 0;

EDIT

// 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...