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 发送图像的主要内容,如果未能解决你的问题,请参考以下文章