Хранение и получение изображений из базы данных

Я создал приложение ASP.NET/C# для загрузки изображения в базу данных MySQL. Процесс выполняется без каких-либо ошибок, но для любого загружаемого изображения я получаю вывод белого изображения размером 100x100. Процедура, которой я следовал, такова.

1) Создана база данных с полем picture и введите Binary(255),

2) Загрузил изображение как cmd.Parameters.Add("@picture", OdbcType.Binary, 255).Value = FileUpload1.FileBytes;

3) Выполнение выше новой записи вставляется и генерируется значение чего-то ниже вида.89504e470d0a1a0a0000000d49484452000002600000010008020000009b155d400000100049444154789cd4dc05745b57a2377a15c26088d99651b2248b999959b2c0966cc9cccccc8e1ddb01439899d3a4499a869999e33037d0340d34d4b4d5dbaee7e6f6b5337367eefad67bf3adf55f676dd98e221f6b9ddffeef738e20db5cbf826c77fd3638d8eafa6587ebd79daedfc0f6afd9eefae5ab372fd6bf7db9e5e7b7075dae4daf5e1c76b98ebb5cfb7ef935a5b31b028b32ea53f6ec3a77efe60fb919156e34222b297ee3aedd2e97ebe6dd870b96acd8b0efc0891bb76ae7ce8ba9a8dc70f1f2c917afaeb95ce75c1f276cd988b0180329c4c4aaf2d2

// --------------- Загрузка модуля завершена ----------------- //

1) Создана страница ASPX с

<asp:Image ID="img" runat="server" ImageUrl="~/MyImage.ashx" />

2) Левый файл ASPX.CS без кода

3) Добавлен ASHX-файл с

<%@ WebHandler Language="C#" Class="MyImage" %>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Drawing.Imaging;

public class MyImage : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/png";
        var data = "89504e470d0a1a0a0000000d49484452000002600000010008020000009b155d400000100049444154789cd4dc05745b57a2377a15c26088d99651b2248b999959b2c0966cc9cccccc8e1ddb01439899d3a4499a869999e33037d0340d34d4b4d5dbaee7e6f6b5337367eefad67bf3adf55f676dd98e221f6b9ddffeef738e20db5cbf826c77fd3638d8eafa6587ebd79daedfc0f6afd9eefae5ab372fd6bf7db9e5e7b7075dae4daf5e1c76b98ebb5cfb7ef935a5b31b028b32ea53f6ec3a77efe60fb919156e34222b297ee3aedd2e97ebe6dd870b96acd8b0efc0891bb76ae7ce8ba9a8dc70f1f2c917afaeb95ce75c1f276cd988b0180329c4c4aaf2d2";
        var buffer = StringToByteArray(data);
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);
    }

    private byte[] StringToByteArray(string hex)
    {
        return Enumerable
            .Range(0, hex.Length)
            .Where(x => x % 2 == 0)
            .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
            .ToArray();
    }
    public bool IsReusable
    {
        get { return false; }
    }
}

При выполнении этого кода белое изображение 100x100 отображается на выходе для любого цветного ввода. Я дважды проверил ContentType и загружал различные изображения разных размеров и форматов, но что бы я ни делал, я получаю вывод одного и того же белого изображения. Что не так в моем коде? какие-либо исправления?

3 ответа

Решение

Вы можете попробовать сохранить изображение в виде строки в кодировке Base64, а затем преобразовать его обратно в изображение, если вы хотите, чтобы оно отображалось на вашей веб-странице.

Вот ссылка на то, как это сделать.

Base64String для изображения и наоборот

Вот ссылка на то, как я использовал это в своем проекте, не совсем из изображения или из базы данных, но концепция та же самая.

При использовании моего метода на вашей веб-странице вы будете использовать

<img src="${downloadurl}" />

255-байтовый тип двоичного поля не будет достаточно большим, чтобы обрабатывать что угодно, кроме самых маленьких изображений. Проверьте размер загружаемых файлов и соответственно измените размер поля.

У меня есть этот код в Ashx, который извлекает данные изображения и отображает его из базы данных MSSQL

public void ProcessRequest(HttpContext context)
    {
        Guid picid;
        if (context.Request.QueryString["picid"] != null)
            picid = new Guid(context.Request.QueryString["picid"]);
        else
            throw new ArgumentException("No parameter specified");

        context.Response.ContentType = "image/jpeg";
        Stream strm = ShowPicImage(picid);
        byte[] buffer = new byte[4096];
        int byteSeq = strm.Read(buffer, 0, 4096);

        while (byteSeq > 0)
        {
            context.Response.OutputStream.Write(buffer, 0, byteSeq);
            byteSeq = strm.Read(buffer, 0, 4096);
        }
    }

    public Stream ShowPicImage(Guid piciddata)
    {
        ProductPicture pictureData = new ProductPicture("ProductPictureID", piciddata);
        object img = pictureData.Data;
        try
        {
            return new MemoryStream((byte[])img);
        }
        catch
        {
            return null;
        }
    }

я не знаю, можете ли вы попытаться решить эту проблему. (Где тип свойства pictureData.Data - это byte[], а соответствующий столбец базы данных - это varbinary(max))

обновленный ответ

Вы также можете рассмотреть возможность сохранения данных в базе данных как BLOB

Другие вопросы по тегам