C# 通过 HTTP 发送图像

Posted

技术标签:

【中文标题】C# 通过 HTTP 发送图像【英文标题】:C# send image over HTTP 【发布时间】:2011-05-08 11:30:35 【问题描述】:

我这里有一个用 C# 编写的小型 HTTP 服务器,直到现在我只需要将原始文本发送回发送者。但是现在我必须发送一个 JPG-Image 并且我不明白如何。

这就是我现在拥有的:

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

我想我必须做某种文件流而不是字符串,但我真的没有胶水..

【问题讨论】:

你能发布你的handleRequest方法的一部分吗?我猜这就是您构建 HTTP 响应对象的地方,该对象将被发送回发出请求的浏览器。您必须弄清楚如何修改它以支持图像。 如果你想借,我有胶水:/ @Martin 如果您正在从文件中读取,您可以调用 socket.SendFile 。请参阅此处(msdn.microsoft.com/en-us/library/sx0a40c2.aspx 【参考方案1】:

您要从文件还是位图对象发送?

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

编辑

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

对于通过套接字发送 MemoryStream,你可以使用这个方法给定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;
 

【讨论】:

嗯。真的有一个发送重载的流吗? @jgauffin - 如果您只对发送文件感兴趣,则可以选择 socket.SendFile()。但是,这不会提供正确响应所需的任何正确 HTTP 响应格式。 这不是我问的:) AFAIK 没有将流作为参数的重载。 为什么不让 SendVarData 将 Stream 作为参数呢?似乎内存效率更高。 如果你正在读取文件,你可以调用 socket.SendFile 。看这里(msdn.microsoft.com/en-us/library/sx0a40c2.aspx)【参考方案2】:

为什么要自己创建一个httpserver?为什么不使用开源的呢?比如我的: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");

【讨论】:

因为它非常简单,而且它不像 HTTP 服务器。我只收到命令示例:localhost/winamp.play 真的吗?向我展示一个可以嵌入到 .Net 2.0 应用程序中的 http 服务器。 .Net HttpListener 需要管理权限才能订阅某些 uri。不是很灵活。我的观点是,如果你没有足够的 HTTP 知识,你可能会浪费大量时间来尝试让东西正常工作。使用现有库应该更有效。 也许他们的目的是收集有关 HTTP 和 C# 的知识?并非一切都是为了提高生产力。 @HackerCow:阅读实际实现不是最好的方法吗? 不,学习协议的最好方法是实现,而学习语言的最好方法是在其中实现一些东西(至少对我来说是这样)

以上是关于C# 通过 HTTP 发送图像的主要内容,如果未能解决你的问题,请参考以下文章

通过电子邮件发送带有图像的 html 文件

通过 ADS.Net 将数组从 C# 发送到 TwinCat 3

在 C# 中使用 HTTP POST 发送文件 [关闭]

使用 C# 通过 HTTP POST 发送文件

C# 如何通过 TCP 为 HTTP 发送文件?

通过 SOCKET 发送文件