首页 > 解决方案 > 无法将 SQL VARBINARY 正确转换为 byte[] 并在 ASP.NET c# 中转换为 Image

问题描述

这是我正在做的事情:

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" />

我错过了什么?

标签: c#sqlarraysimage-processing

解决方案


<img src=...必须通过其路径指向图像文件,例如<img src="/myImage.jpg">。您不能将图像的二进制表示形式粘贴在其中src并使其正常工作。

因此,您可以将这些二进制图像写入磁盘的某个地方(您可能不想这样做,因为您正在复制数据,并且必须管理同步)。

或者您可以创建某种图像处理程序,因此<img src=类似于: <img src="/myHandler/imageId",然后让处理程序从数据库中读取二进制数据并以图像进行响应。

这是我过去用来从数据库中读取二进制 PDF 并将其作为文件返回的 MVC 控制器操作。这是在我的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");
    }

推荐阅读