【问题标题】:Convert Image data type into Base64 and Base64 into Image data type将 Image 数据类型转换为 Base64 和 Base64 转换为 Image 数据类型
【发布时间】:2019-07-15 05:02:04
【问题描述】:

我在 MS SQL 2012 中使用数据类型“图像”来存储图像。

问题:我在 C# 的 BASE64 字符串中有一个图像

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

我将其转换为 C# 中的 byte[],因为我需要将其保存到数据类型为 IMAGE 的列中。 像这样:

byte[] imageInByteArray =Convert.FromBase64String("MyImage");

这样保存成功:

数据库中的byte[]数组数据-

现在我正在尝试检索图像并使用以下方法将其转换回 BASE64:

var imageA = results.Read<byte[]>().ToArray();
string imageB =Convert.ToBase64String(imageA);

现在我得到这样的结果:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw

结果不是我期待的应该是这样的

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

【问题讨论】:

  • 如果可以的话,我建议使用varbinary(MAX)image 在 SQL Server 2005 中已弃用。
  • 嘿@Larnu,谢谢你的建议。但我无法修改数据类型

标签: c# sql-server base64 tobase64string


【解决方案1】:

我相信您需要有关如何在 sql server 中存储图像数据的帮助。

您可以创建如下表。请注意,您可能不想创建数据库,只需一个表就足够了。如果您已经有一个要保存此数据的表,则必须确保列的类型是 varbinary(max)。

CREATE DATABASE MyDatabase;  
GO  
USE MyDatabase;  
GO  
CREATE TABLE MyImageDatabaseTable (Id int, BLOBData varbinary(max));  
GO  

那么你可以读取数据为:

SqlConnection objConn = new SqlConnection(connectionString);  
objConn.Open();  
SqlCommand objCmd = new SqlCommand("Select * From MyImageDatabaseTable", objConn);  
SqlDataReader dr = objCmd.ExecuteReader();  
while(dr.Read())
{
     byte[] myImageByteArrayData = (byte[]) dr["BLOBData"];  

     string myImageBase64StringData = Convert.ToBase64String(myImageByteArrayData );
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    回答你的问题

    如何使用这个 byte[] 数组从数据库中检索 base64?

    SQL-Server 在将二进制文件嵌入 XML 时会将其隐式转换为 base64。

    试试这个

    --I fill a binary variable with some dummy content
    DECLARE @SomeBinary VARBINARY(MAX) = CAST('This is a dummy content' AS VARBINARY(MAX));
    --this is the resulting binary
    SELECT @SomeBinary;
    --Now you see what happens using FOR XML PATH
    SELECT (SELECT @SomeBinary FOR XML PATH(''))
    

    我们可以轻松地重新转换它

    DECLARE @base64 VARCHAR(MAX)='VGhpcyBpcyBhIGR1bW15IGNvbnRlbnQ=';
    SELECT CAST(@base64  AS XML).value('.','varbinary(max)');
    

    您可能必须先使用CAST(YourImageTypedColumn AS VARBINARY(MAX))

    但将其作为二进制文件检索并在客户端应用程序上进行转换可能更容易。

    【讨论】:

    • 你好@shnugo,但我没有得到与之前相同的base 64字符串。我首先在 C# 中将 Base64 字符串转换为 byte[],然后将其保存到数据库中的 IMAGE 类型列中,现在我想检索我拥有的确切 Base64 字符串。
    • @DivyaAgrawal 您的意思是,您的二进制文件是 base64 字符串而不是代表图片的字节数组吗?试试CAST(yourBinaryColumn AS VARCHAR(MAX)
    • 它给了我错误。不允许从数据类型 image 到 varchar(max) 的显式转换。
    • @DivyaAgrawal 如上所述,您必须先转换为 varbinary(max)
    • 请再看一遍问题我已经编辑过了,可能之前不太清楚。
    【解决方案3】:

    我使用下面的这种方法,将 bytearray 从数据库转换为图像。

    public Bitmap ConvertByteArrayToBitmap(byte[] Array)
    {
        if (Array == null) return null;
    
        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            ms.Write(Array, 0, Array.Length);
            ms.Position = 0L;
    
            return new Bitmap(ms);
        }
    }
    

    问候。

    【讨论】:

    • 对不起,我没明白。这不是我正在寻找的解决方案。
    【解决方案4】:

    我找到了解决方案,请查看此问题,因为当您不想更改数据库中的图像数据类型时,它可能很有用:

    我将 base64 字符串原样发送到数据库,然后我将其转换为 varbinary,如下所示:

    SELECT CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@Image2"))', 'varbinary(max)')
    

    并将其插入到图像列中。

    然后我在 base64 中检索了一个图像,如下所示:

     SELECT cast('' as xml).value('xs:base64Binary(sql:column("img"))', 'varchar(max)') FROM imageTemp WHERE...
    

    它给了我之前发送的确切 Base64 字符串。

    谢谢。

    【讨论】:

      【解决方案5】:

      您可以使用 XML 和“for xml path”提示将二进制转换为 Base64

      select file_name,ColumnWithBinary,ColumnToSwFinalResult
      from TableWithBinary
      cross apply (select ColumnWithBinary '*' for xml path('')) T (ColumnToSwFinalResult)
      GO
      

      【讨论】:

        【解决方案6】:

        我明白了!!!

        C#代码

        string base64Encoded = Convert.ToBase64String(((byte[])result.photoFromSQLImageColumn));
        string base64Decoded;
        byte[] data = System.Convert.FromBase64String(base64Encoded);
        base64Decoded = System.Text.ASCIIEncoding.ASCII.GetString(data);
        

        并且在这个变量中-----> base64Decoded 您将拥有正确的 base64 字符串!

        来自墨西哥的问候!!!

        【讨论】:

          猜你喜欢
          • 2013-06-18
          • 2019-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-28
          • 2023-03-13
          • 2011-08-12
          • 2014-10-28
          相关资源
          最近更新 更多