2016-10-12 4 views
3

Я пытаюсь вернуть строку base64, представляющую образ jpeg из контроллера API, и установить его как src <img>, но все мои попытки не удались ,ASP.NET Core API Controller: Response.Body.WriteAsync base64 строка не работает

Вот очень простой HTML:

<img src="/api/TestBase64Image" alt="image test" /> 

И мой контроллер:

[Route("api/[controller]")] 
public class TestBase64ImageController : Controller 
{ 
    private const string _base64Image = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/7Sfg....."; 
    private const string _base64Image2 = "/9j/4AAQSkZJRgABAQEBLAEsAAD/7Sfg..... 

    [HttpGet] 
    public async Task Get() 
    { 
     Response.ContentType = "image/jpeg"; 
     //Response.ContentType = "text/plain"; 
     //Response.ContentType = new MediaTypeHeaderValue("image/jpeg").ToString(); 
     //Response.ContentType = new MediaTypeHeaderValue("text/plain").ToString(); 

     //Response.Headers.Add("Content-Length", _base64Image.Length.ToString()); 
     //HttpContext.Response.ContentLength = _base64Image.Length; 

     await Response.Body.WriteAsync(Encoding.UTF8.GetBytes(_base64Image), 0, _base64Image.Length); 
     //await Response.Body.FlushAsync(); 
    } 
} 

Я попробовал несколько вещей, как удаление FlushAsync(), изменяя способ определения ContentType, включают data:image/jpeg;base64 , в строке или нет, но ничего не работает.

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

Да, моя строка base64 верна, потому что я также попытался включить ее непосредственно в HTML, и изображение отображается правильно.

Я точно не хочу использовать JavaScript или Razor для достижения этого, только чистый HTML и мой контроллер.

Также обратите внимание, что я внутри контроллера API. Я не могу сделать то же самое, как мы видим в методе Configure в Startup классе пустого проекта ASP.NET ядра, как:

app.Run(async (context) => 
{ 
    await context.Response.WriteAsync("Hello World!"); 
}); 

Несмотря на то типы Оба ответа являются HttpResponse, один в моем контроллере Безразлично «т есть Response.WriteAsync но Response.Body.WriteAsync

Спасибо за вашу помощь, это уже несколько часов я ищу, но почти нет ресурсов, об этом пока для ASP.NET Ядра

+0

Почему вы пытаетесь вернуть изображение base64, когда оно запрошено? Точка URI базы данных64 заключается в встраивании данных в HTML. Для простого регулярного извлечения изображений вы должны напрямую вернуть двоичные данные. –

+0

Я в контексте наличия изображения в качестве строки base64, у меня нет физического файла для обслуживания. Но разве это не то, что я делаю, возвращая двоичные данные с помощью 'Encoding.UTF8.GetBytes'? Я потерял способ сделать это, потому что в старой ASP.NET (не MVC) я сделал это с помощью 'Response.BinaryWrite', но в Core нет такой вещи ... –

+2

Для записи причина вашего кода контроллера не имеет «Response.WriteAsync()», потому что вы не включили пространство имен с требуемым методом расширения. ;) Добавьте 'using Microsoft.AspNetCore.Http;' на страницу вашего контроллера, и он будет там. СОВЕТ. Если вы наберете имя метода расширения, VS попытается разрешить его для вас с помощью быстрого действия. –

ответ

3

Вы по-прежнему возвращает данные как base64 текст, в основном - вы получаете кодированную форму UTF-8, но t шляпа все.

Если вы действительно только версия base64 изображения, вам просто нужно расшифровать, что:

byte[] image = Convert.FromBase64String(_base64Image2); 
await Response.Body.WriteAsync(image, 0, image.Length); 

(. Обратите внимание, что это должно быть только base64 конвертирования - не данные URI)

+0

Ничего себе решение было так просто, мне интересно, как я пропустил это ... Супер быстрый ответ, спасибо много Jon. ('WriteAsync' также ждет' offset' и 'length', я позволю вам отредактировать ваш ответ ...) –

+0

@ JérômeMével: Сделано, спасибо. –