2010-11-11 42 views
14

J'ai ici un petit serveur HTTP écrit en C# et jusqu'à présent j'avais seulement besoin d'envoyer du texte brut à l'expéditeur. Mais maintenant je dois envoyer une image JPG et je ne comprends pas comment.C# Envoyer l'image via HTTP

c'est ce que j'ai maintenant:

// 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)); 

Je pense que je dois faire une sorte de filestream au lieu d'une chaîne, mais je n'ai vraiment pas de colle ..

+0

Pouvez-vous envoyer une partie de votre méthode de handleRequest? Je devine que c'est là que vous construisez l'objet de réponse HTTP qui sera renvoyé au navigateur faisant la demande. Vous devrez trouver comment modifier cela pour prendre en charge les images. –

+1

J'ai de la colle si vous voulez l'emprunter:/ – jlafay

+0

@Martin Si vous lisez à partir du fichier, vous pouvez simplement appeler socket.SendFile. voir ici (msdn.microsoft.com/en-us/library/sx0a40c2.aspx –

Répondre

1

Voulez-vous envoyer de fichier ou objet Bitmap?

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

EDIT

// Send the response 
SendVarData(socket,memoryStream.ToArray()); 

pour envoyer MemoryStream par socket, vous pouvez utiliser cette méthode donnée here

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; 
} 
+0

Ehh. Existe-t-il vraiment une surcharge d'envoi prenant un flux? – jgauffin

+0

@jgauffin - socket.SendFile() serait l'option si vous étiez seulement intéressé par Cependant, cela n'indiquera pas le bon format de réponse HTTP requis pour une réponse correcte: –

+0

Ce n'est pas ce que j'ai demandé :) AFAIK il n'y a pas de surcharge prenant un flux comme argument. – jgauffin

1

Pourquoi avez-vous créé un HTTPServer par vous-même? Pourquoi ne pas utiliser un open source? Par exemple le mien: 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(); 
    } 

} 

Modifier

Si vous voulez vraiment ne le faire par vous-même:

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"); 
+0

parce que c'est un très simple et il n'agit pas comme un HTTP Serveur .. Je reçois seulement l'exemple de commandes: http: //localhost/winamp.play – Martin

+2

Pourquoi avez-vous écrit un httpserver quand des serveurs existent déjà? –

+0

Vraiment? Montrez-moi un serveur http qui peut être intégré dans une application .Net 2.0. Le .Net HttpListener nécessite des privilèges d'administration pour pouvoir s'abonner sur certains uris. Pas très flexible. Mon point était que si vous n'avez pas assez de connaissances sur le protocole HTTP, vous perdrez probablement du temps à essayer de faire fonctionner les choses. Il devrait être plus efficace d'utiliser des bibliothèques existantes. – jgauffin