Повторное отображение изображения в API не отображает изображение правильно

#c# #asp.net #image

#c# #asp.net #изображение

Вопрос:

Привет, у меня есть сообщение api, в котором отображаются рекламные изображения в базе данных, и я получаю изображение. Когда я выдаю http://myserver/dynamic/images/569e61e9-d8ab-44ba-b935-1f7eae8ba39d.jpg это работает нормально, получите ответ 200 OK, но получите двоичный текст, отображаемый в теле, а не само изображение с правильным заголовком image / jpeg введите описание изображения здесь

введите описание изображения здесь Я просмотрел этот форум и увидел проблемы, связанные с перехватчиком, который отключен в моем postman.

 byte[] buffer = null; 
var id = Guid.Parse(Path.GetFileName(path).Split(".")[0]); 
using (var db = new EFContext()) { 
  var imageFromDb = await db.Images.SingleOrDefaultAsync(x => x.Id == id); 
  buffer = imageFromDb.Data; 
} 

if (buffer != null amp;amp; buffer.Length > 1) { 
  context.Response.ContentLength = buffer.Length;
  context.Response.ContentType = "image/"   Path.GetExtension(path).Replace(".", ""); 
  await context.Response.Body.WriteAsync(buffer, 0, buffer.Length); 
} 
else {
  context.Response.StatusCode = 404; 
} 
  

Комментарии:

1. Чтобы лучше помочь вам, не могли бы вы опубликовать данные вашего запроса, технический стек, который вы используете для вызова своего API, и минимальный жизнеспособный образец вашего кода?

2. Это get для извлечения изображений из базы данных sqlite. Имя изображений GUId.jpg пример: 569e61e9-d8ab-44ba-b935-1f7eae8ba39d.jpg . API представляет собой код на C #

3. byte[] buffer = null; идентификатор переменной = Guid.Parse(Путь.GetFileName(путь). Разделение(«.»)[0]); используя (var db = new EFContext()) { var imageFromDb = await db. Изображения. SingleOrDefaultAsync(x => x.Id == идентификатор); buffer = imageFromDb.Data; } если (buffer != null amp;amp; buffer. Длина> 1) { context.Response. ContentLength = buffer . Длина; контекст.Ответ. ContentType = «image/» Path.getExtension(путь). Replace(«.», «»); ожидает context.Response.Body . WriteAsync(буфер, 0, буфер. Длина); } else context.Response. StatusCode = 404; }

4. byte[] buffer = null; идентификатор переменной = Guid.Parse(Путь.GetFileName(путь). Разделение(«.»)[0]); используя (var db = new EFContext()) { var imageFromDb = await db. Изображения. SingleOrDefaultAsync(x => x.Id == идентификатор); buffer = imageFromDb.Data; } если (buffer != null amp;amp; buffer. Длина> 1) { context.Response. ContentLength = buffer . Длина; контекст.Ответ. ContentType = «image/» Path.getExtension(путь). Replace(«.», «»); ожидает context.Response.Body . WriteAsync(буфер, 0, буфер. Длина); } else context.Response. StatusCode = 404; }

Ответ №1:

Взглянув на ваш код, я вижу, что проблема связана с типом MIME вашего ответа. Для отображения изображений в формате jpg (jpeg) необходимо использовать следующий MIME-тип:

 image/jpeg
  

Обновите свой код следующим образом, и он будет корректно отображать изображение:

 byte[] buffer = null; 
var id = Guid.Parse(Path.GetFileName(path).Split(".")[0]); 
using (var db = new EFContext()) { 
  var imageFromDb = await db.Images.SingleOrDefaultAsync(x => x.Id == id); 
  buffer = imageFromDb.Data; 
} 

if (buffer != null amp;amp; buffer.Length > 1) { 
  context.Response.ContentLength = buffer.Length;
  context.Response.ContentType = "image/jpeg"; 
  await context.Response.Body.WriteAsync(buffer, 0, buffer.Length); 
} 
else {
  context.Response.StatusCode = 404; 
} 
  

Если вы ищете более динамичный метод назначения типа mime, вы можете использовать что-то вроде этого. Обратите внимание, что это далеко не полный и служит примером:

 var fileExtension = Path.GetExtension(path).Replace(".", "");
var mimeType = "image/jpeg";
switch(fileExtension) {
  case "svg":
    mimeType = "image/svg xml";
  case "png":
    mimeType = "image/png";
  case "jpg":
  case "jpeg":
  case default:
    mimeType = "image/jpeg";
}

//...
context.Response.ContentType = mimeType;
//...
  

См. https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types для получения более подробной информации о типах MIME.

Комментарии:

1. Вы правы, я извлекал расширение из файла изображения jpg, теперь оно работает как шарм, так что большое спасибо и извините за мой отложенный ответ