API возврат изображения

2

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

public IActionResult Get(string PictureCode)
{
    SqlParameter[] parameters = {new SqlParameter("@PictureCode", PictureCode) };
    var PD = db.Picture.FromSql("SIP_API_MONDIA_ItemPicture_sel @PictureCode", parameters).ToList();
    var contents = new MemoryStream(PD[0].PictureData);
    return File(contents, "image/png"); 
}

Редактировать: 1) PD имеет тип PictureModel

var PD = db.Picture.FromSql("SIP_API_MONDIA_ItemPicture_sel @PictureCode", параметры).ToList();

Модель изображения:

public class PictureModel
{
    [Key]
    public byte[] PictureData { get; set; }
}

Ошибка: Изображение 174551

Edit2: Пример хранимой процедуры:

GO
ALTER Procedure [dbo].[SIP_API_MONDIA_ItemPicture_sel]
(
 @PictureCode int = null
)
As
Begin

 If @PictureCode is not null
 Begin
    Select t1.PictureData From T_Picture t1 Where t1.PictureCode = @PictureCode
 End

 return 0
End

Где PictureData - это тип varbinary (max) в T_Picture

Edit3: Middleware, где происходит ошибка (см. Экран печати):

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        // Add middleware before MVC
        app.Use(async (ctx, next) =>
        {
            // Capture the original response body stream
            var responseStream = ctx.Response.Body;

            // Replace it with our own, so that we can read it
            using (var bodyStream = new MemoryStream())
            {
                ctx.Response.Body = bodyStream;

                //if (ctx.Request.Path.Value.Contains("customers") && !ctx.Request.QueryString.Value.Contains("?$expand"))
                //{
                //    ctx.Response.Redirect($"" + ctx.Request.Path.Value + "?$expand=FreeFields,Contact,Address");

                //}
                // Run ASP.NET MVC (ie. get the results back from your code)
                await next();

                // Put the original response body stream back
                ctx.Response.Body = responseStream;

                // Read the one that we captured
                bodyStream.Seek(0, SeekOrigin.Begin);
                var responseBody = await new StreamReader(bodyStream).ReadToEndAsync();

                // If it ODATA & JSON & 200 (success), replace the "value" with "results"
                if (ctx.Response.ContentType.Contains("application/json") && ctx.Response.ContentType.Contains("odata") && ctx.Response.StatusCode == 200)
                {
                    responseBody = responseBody.Replace("\"value\"", "\"results\"");
                }

                // Write back the response body (whether modified or not) to the original response stream
                await ctx.Response.WriteAsync(responseBody);
            }
        });

        app.UseMvc(b =>
        {
            b.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
            b.MapODataServiceRoute("odata", "odata", GetEdmModel());
        });
    }
  • 0
    как выглядит код db.Picture.FromSql ? Вы можете отредактировать свой вопрос, чтобы показать это?
  • 0
    Привет Алекс, imgur.com/VL42g7P это массив байтов
Показать ещё 17 комментариев
Теги:
asp.net-core
entity-framework-core
asp.net-core-webapi
asp.net-web-api

1 ответ

-2

Ты можешь сделать:

var contents= new MemoryStream(PD[0].PictureData); // since PictureData is a byte array

После этого вы можете поместить поток в метод File():

return File(contents, "CorrectMimeTypeHere"); // image/png or image/jpeg

Ещё вопросы

Сообщество Overcoder
Наверх
Меню