c# Web Server - 如何发送图片

Posted

技术标签:

【中文标题】c# Web Server - 如何发送图片【英文标题】:c# Web Server - How to send images 【发布时间】:2015-10-09 02:40:51 【问题描述】:

我正在使用 C# 创建一个服务器,我能够接收请求并返回 html,但我不确定我必须做什么才能发送图像文件以便它们显示在页面上。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace Ambar

    class Program
    


        static void Main(string[] args)
        
            TcpListener listener = new TcpListener(80);
            listener.Start();
            while (true)
            
                Console.WriteLine("waiting for a connection");
                TcpClient client = listener.AcceptTcpClient();

                StreamReader sr = new StreamReader(client.GetStream());
                StreamWriter sw = new StreamWriter(client.GetStream());
                Console.WriteLine(client.GetStream().ToString());

                try
                
                    string request = sr.ReadLine();

                    Console.WriteLine(request);
                    string[] tokens = request.Split(' ');
                    string page = tokens[1];
                    if (page == "/")
                    
                        page = "/default.htm";
                    
                    StreamReader file = new StreamReader("../../web" + page);
                    sw.WriteLine("HTTP/1.0 200 OK\n");

                    string data = file.ReadLine();
                    while (data != null)
                    
                        sw.WriteLine(data);
                        sw.Flush();
                        data = file.ReadLine();
                    
                
                catch (Exception e)
                
                    sw.WriteLine("HTTP/1.0 404 OK\n");
                    sw.WriteLine("<H1> Future Site of Ambar Remake </H!>");
                    sw.Flush();
                

                client.Close();
            
        
    

我可以托管任何我想要的 HTML,但如果我尝试显示类似的图像

&lt;img src="picture.gif" alt="a picture" height="42" width="42"&gt;

我不确定如何托管该图像并将其显示在那里。

【问题讨论】:

您是否尝试以二进制格式发送图像? 【参考方案1】:

HTTP请求和响应头有两个换行符(\n)来划分Header部分和内容部分。

例如: (Request 向服务器请求图像(image.gif))

GET /image.gif HTTP/1.1
User-Agent: WebBrowser
Accept-Encoding: deflate,gzip
Connection: keep-alive
... and more headers if present ...

响应图像请求)

HTTP/1.1 200 OK
Content-Length: <Length_Of_Content>
Content-Type: image/gif
... and more headers if present ...

<Data_Of_Image>

如您所见,response headercontents 之间有两个换行符 (\n)。 因此,您必须将文件读取为字节数组(byte[])。在这种情况下,您可以使用System.IO.File.ReadAllBytes(string) 轻松读取文件。

现在,还剩一个。我告诉过你以字节数组的形式读取文件,但无法加入stringbyte[]。因此,您必须将字符串编码为 byte[] 并连接标头字节和内容字节。 + 我们无法通过StreamWriter 发送字节数组,所以我们将使用NetworkStream

解释如下:

NetworkStream ns = client.GetStream();

...

string[] tokens = request.Split(' ');
string page = tokens[1];
if (page == "/")

    page = "/default.htm";

//StreamReader file = new StreamReader("../../web" + page);
byte[] file = null;

try  file = File.ReadAllBytes(@"../../web" + page); 

// In this 'catch' block, you can't read requested file.
catch 
    // do something (like printing error message)


// We are not going to use StreamWriter, we'll use StringBuilder
StringBuilder sbHeader = new StringBuilder();

// STATUS CODE
sbHeader.AppendLine("HTTP/1.1 200 OK");

// CONTENT-LENGTH
sbHeader.AppendLine("Content-Length: " + file.Length);

// Append one more line breaks to seperate header and content.
sbHeader.AppendLine();

// List for join two byte arrays.
List<byte> response = new List<byte>();

// First, add header.
response.AddRange(Encoding.ASCII.GetBytes(sbHeader.ToString()));

// Last, add content.
response.AddRange(file);

// Make byte array from List<byte>
byte[] responseByte = response.ToArray();

// Send entire response via NetworkStream
ns.Write(responseByte, 0, responseByte.Length);

就是这样。我希望你能理解我糟糕的英语:O。 希望对您有所帮助!

【讨论】:

【参考方案2】:

我假设您正在使用网络套接字。

您需要将图像作为 base 64 编码字符串返回,然后使用

<img src ="data:image/png;base64," + base64ImageHere

格式

【讨论】:

以上是关于c# Web Server - 如何发送图片的主要内容,如果未能解决你的问题,请参考以下文章

CKEditor 和 C# Web API,使用简单的上传插件上传图片

C# 如何配置公司邮箱发送邮件配置

如何从 C# ASP.NET 参数将希伯来语文本发送到 SQL Server?

如何从c#发送邮件

如何使用 C# 向所有设备发送带有图像的 FCM 通知?

如何将文件和文件路径从 C# 控制器发送到视图