Не удается правильно преобразовать SQL VARBINARY в byte [] и преобразовать в Image в ASP.NET c # - PullRequest
0 голосов
/ 07 марта 2019

Вот что я делаю:

public static MVC_Picture GetPictureRecord(int pictureID)
{
    int pictureId = pictureID;
    MVC_Picture _picture = new MVC_Picture(); //object that stores name and array

    var connString = db.connString;
    string cmdText = "SELECT PictureName, PictureImage FROM Picture WHERE CONVERT(INT, ID) =@pictureId;";
    using (var connection = new SqlConnection(connString))
    {
        using (var sqlCmd = new SqlCommand(cmdText, connection))
        {
            SqlParameter param1 = new SqlParameter();
            param1.ParameterName = "@pictureId";
            param1.Value = pictureId;
            sqlCmd.Parameters.Add(param1);

            connection.Open();
            SqlDataReader dr = sqlCmd.ExecuteReader();
            while (dr.Read())
            {
                _picture.Id = pictureId;
                _picture.PictureName = Convert.ToString(dr["PictureName"]);
                _picture.PictureImage = (byte[])(dr["PictureImage"]); //Problem
            }
            connection.Close();
        }
    }

    return _picture; 
}

Когда я преобразовываю в byte[], я получаю что-то вроде: {byte[4354567]}

Затем я пытаюсь преобразовать массив вImage вот так:

Image img = (Image)converter.ConvertFrom(_picture.PictureImage);
ViewModel.FeaturedImage = img;

И в поле зрения я использую:

<img src="@ViewModel.FeaturedImage" alt="Featured Image" />

Чего мне не хватает?

1 Ответ

0 голосов
/ 07 марта 2019

<img src= ... должен указывать на файл изображения по его пути , например <img src="/myImage.jpg">. Вы не можете вставить двоичное представление изображения в src и заставить его работать.

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

Или вы можете создать какой-нибудь обработчик изображения, так что <img src= будет выглядеть примерно так: <img src="/myHandler/imageId", а затем обработчик прочитает двоичные данные из базы данных и ответит изображением.

Это действие контроллера MVC, которое я использовал в прошлом для чтения двоичного PDF-файла из БД и его возврата в виде файла. Это в моем Competition контроллере. Если бы это возвращало изображение, вы могли бы назвать это что-то вроде:

<img src="Competition/ViewJobDescription?competitionId=1234" />

    public ActionResult ViewJobDescription(int competitionId)
    {
        string errorMsg = "";
        var competition = new DBModel.Competition();
        try
        {               
            competition = DBModel.Competition.GetCompetition(competitionId);
            if (competition != null && competition.AttachmentContent != null)
            {
                byte[] fileData = competition.AttachmentContent;
                string filename = competition.AttachmentTitle + ".pdf";
                return File(fileData, "application/pdf", filename);
            }
        }
        catch (Exception ex)
        {
            errorMsg += "An error occured: " + ex.Message;
            LogFile err = new LogFile();
            err.CreateErrorLog(errorMsg);

            ModelState.AddModelError(string.Empty, errorMsg);
        }

        return RedirectToAction("Index", "Home");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...