Сервер для отображения картинок в веб-браузере - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь отправить изображение с сервера на клиент (веб-браузер). Поэтому, когда я открываю ссылку в браузере, например, https://localhost:8080/geoserver/ (я установил порт на 8080 в начале), он будет отображать сообщение «Привет, мир», что хорошо, но теперь я пытаюсь отправить изображение с StreamWriter и все, что я получил, это какой-то текст типа System.Drawing.Bitmap, и в браузере не было изображения. Я работаю с консольным приложением c #.

Мой код:

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");
    }
}

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Вы можете сделать это, преобразовав изображение в 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 голосов
/ 16 марта 2019

Минимальные изменения, необходимые для работы вашего кода, - это использование метода 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 низкого уровня?Может быть, вы могли бы использовать ASP.Net Core с Kestrel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...