Как вернуть изображение в виде IActionResult из объекта Image / Bitmap - PullRequest
0 голосов
/ 29 мая 2018

Я создаю изображение штрих-кода, используя библиотеку barcodelib + пакет System.Drawing.Common, доступный в .Net Core.

Я хочу вернуть изображение в браузер пользователям в виде простого изображения (или как загрузка) но я, похоже, не могу найти хороший способ сделать это.

Что я пробовал:

var barcode = new Barcode().Encode(TYPE.CODE128, reference);
usuing (var outputStream = new MemoryStream()) 
{
    barcode.Save(outputStream, ImageFormat.Jpeg);
    outputStream.Seek(0, SeekOrigin.Begin);
    return File(outputStream, "image/jpeg");
}

Это дает исключение, говоря, что поток закрыт.

Это можно исправить, удалив использование, но не плохо ли это?потоки не остаются в памяти?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Хотя FileResult закроет поток, честно говоря, мне не нравится зависеть от какой-то внешней вещи, убирающей за мной, и, по крайней мере, на мой взгляд, код выглядит просто неправильно, обновляя MemoryStream внеusing блокировать и просто отпускать его, даже не закрывая явно.

Существует перегрузка File, которая принимает байтовый массив, так что вы можете просто переместить ваш возврат за пределы блока using.

byte[] bytes;
using (var ms = new MemoryStream()) 
{
    var barcode = new Barcode().Encode(TYPE.CODE128, reference);
    barcode.Save(ms, ImageFormat.Jpeg);
    bytes = ms.ToArray();
}
return File(bytes, "image/jpeg");

Это немного личное предпочтение, по общему признанию, но для меня это выглядит чище и более "правильно".

0 голосов
/ 29 мая 2018

Снять блок using на outputStream.Поток закрывается / удаляется, прежде чем он может быть использован ответом.

FileResult закроет поток по окончании его использования.

var barcode = new Barcode().Encode(TYPE.CODE128, reference);
var outputStream = new MemoryStream();
barcode.Save(outputStream, ImageFormat.Jpeg);
outputStream.Seek(0, SeekOrigin.Begin);
return File(outputStream, "image/jpeg");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...