用于在Web浏览器中显示图片的服务器

问题描述 投票:0回答:2

我想要做的是将图片从服务器发送到客户端(Web浏览器)。因此,当我在浏览器中打开链接时,例如https://localhost:8080/geoserver/(我在开始时将端口设置为8080)它将显示消息“hello world”,这很好,但现在我正在尝试使用StreamWriter和所有我发送图像得到的是像System.Drawing.Bitmap这样的文字,浏览器中没有显示图片。我正在使用c#console应用程序。

我的代码:

static void Main(string[] args)
{
    HttpListener listen = new HttpListener();
    string url = "http://localhost";
    string port = "";
    Console.Write("Nastavite port:");
    port = Console.ReadLine();
    url = url + ":" + port + "/geoserver/";
    listen.Prefixes.Add(url);
    listen.Start();

    while (true)
    {
        Console.WriteLine("Cakam...");
        HttpListenerContext kontekst = listen.GetContext();

        string msg = "hello world";

        kontekst.Response.ContentLength64 = Encoding.UTF8.GetByteCount(msg);
        kontekst.Response.StatusCode = (int)HttpStatusCode.OK;

        using(Stream stream = kontekst.Response.OutputStream)
        {
            using(StreamWriter writer = new StreamWriter(stream))
            {
                writer.Write(msg);
            }
        }

        Console.WriteLine("Sporočilo poslano");
    }
}
c# server
2个回答
0
投票

您可以通过将图像转换为base64并将其显示在html img标记中来实现。 1)使用System.Drawing库将图片作为字节数组

Image image = Image.FromFile("test-img.jpg");
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imgBytes = ms.ToArray();

2)需要将其转换为base64字符串后

string base64 = Convert.ToBase64String(imgBytes);

3)然后创建html响应文本

string html = $"<html><img src=\"data: image / png; base64, {base64} \"></html>";

4)现在您可以将此文本写入输出流

Stream stream = kontekst.Response.OutputStream;
StreamWriter writer = new StreamWriter(stream);
writer.WriteLine(html);

所以完整的工作代码看起来像这样

static void Main(string[] args)
{
    HttpListener listen = new HttpListener();
    string url = "http://localhost";
    string port = "";
    Console.Write("Nastavite port:");
    port = Console.ReadLine();
    url = url + ":" + port + "/geoserver/";
    listen.Prefixes.Add(url);
    listen.Start();

    while (true)
    {
        Console.WriteLine("Cakam...");
        HttpListenerContext kontekst = listen.GetContext();

        kontekst.Response.StatusCode = (int)HttpStatusCode.OK;

        using (Stream stream = kontekst.Response.OutputStream)
        using (Image image = Image.FromFile("test-img.jpg"))
        using (MemoryStream ms = new MemoryStream())
        using (StreamWriter writer = new StreamWriter(stream))
        {
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            string base64 = Convert.ToBase64String(ms.ToArray());
            writer.WriteLine($"<html><img src=\"data: image / png; base64, {base64} \"></html>");
        }

        Console.WriteLine("Sporočilo poslano");
    }
}

0
投票

使代码工作所需的最小更改是使用Save方法将图像写入流,而不是Writer.Write(),它将调用对象的ToString()(如果它还不是字符数组),从而导致发送类你经历过的名字。

//Can't set the response length upfront, if you really need to set it you need to 
//calculate it from the size of the image.
//kontekst.Response.ContentLength64 = Encoding.UTF8.GetByteCount(msg);
//Most browsers figure it out without this, but good practice to set the type:
kontekst.Response.ContentType = "image/bmp";
kontekst.Response.StatusCode = (int)HttpStatusCode.OK;
var img = Image.FromFile(@"some.bmp");
using (Stream stream = kontekst.Response.OutputStream)
{
    img.Save(stream, ImageFormat.Bmp);
}

我还会考虑改变其他一些事情:

  1. 如果您不需要在服务器上编辑图像,请使用System.Drawing.Bitmap而不是System.Drawing.Image。或者甚至更好,如果您不需要将其视为服务器端的图像,只需使用FileStream读取它并将其写入输出流。
  2. 你真的想要在服务器上实现并处理低级别的HttpContext / listeners吗?也许你可以使用与Kestrel的ASP.Net Core。
© www.soinside.com 2019 - 2024. All rights reserved.