【问题标题】:Storing C# Converted base64 as SQL Server varbinary(max)将 C# 转换的 base64 存储为 SQL Server varbinary(max)
【发布时间】:2014-12-28 15:55:49
【问题描述】:

我有一个 angular webapp,我接受 base64 格式的图像并将它们存储在 T-SQL varbinary 中。但是,我将现有数据存储在 SQL-Server 中,这些数据似乎在不同的二进制文件中。我需要两个二进制文件在 C# 中使用相同的读取/更新方法。

在服务中,我尝试将 base64 字符串转换为 SQL Server 的 varbinary,反之亦然。

在 SSMS 中手动,我可以只取 base64 字符串并像这样插入一行:

Cast(@base64ImgStr as varbinary(max))

但是当我尝试从 C# 插入时结果不同:

Convert.FromBase64String(base64);

(相同的输入)。由于二进制文件不同,因此图像不显示。我需要一个 C# 中的方法,它提供与 T-SQL 中相同的二进制文件。

我必须解决这个问题,因为我可以像这样在 SQL Server 中转换并获得正确的 base64(同样,不是在 C# 中):

cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)')

我返回的是 Unicode 符号而不是 base64,否则我会粘贴一个示例。

我需要在不调用 SQL Server base64Binary 方法的情况下获取 base64,因为我的服务读取图像是这样的:

Encoding.ASCII.GetString(varbinary)

如果我将手动插入的 varbinary (Cast(@base64ImgStr as varbinary(max))) 转换为 varchar(max),我会得到一个 base64 字符串,并且图像会在我的 webapp 中正确显示。 但是,当我使用 C# 方法创建二进制文件时,情况并非如此。使用从 Convert.FromBase64String(base64) 获得的 varbinary 类型,我需要在 SQL Server (xs:base64binary) 中进行中间转换,以将二进制文件反转为 base64。在没有中间转换的情况下,我得到了 Unicode 符号,并且 web 应用程序中没有图像显示。我不想要中间转换,因为无论用户上传图像还是有人手动插入图像,我都想要一致的结果。

我在 Convert 类上没有看到一个方法可以提供相同类型的二进制文件。但这似乎正是我所需要的。我怀疑Unicode。请帮忙!

【问题讨论】:

  • 要存储图像本身,应该存储Convert.FromBase64String(base64); 的结果。 Cast(@base64ImgStr as varbinary(max)) 将存储 base64 编码图像的二进制表示 - 您在回读时是否从/使用 base64 解码?
  • 这是我存储更新图像的方法:pm.SponsorImg = Convert.FromBase64String(vm.sponsorImg);(继续回答 - brb)
  • 所以我相信我正在存储Convert.FromBase64String(base64) 的结果。但是当我拍摄相同的图像并执行Cast(@base64ImgStr as varbinary(max)) 时,该字节数组不会显示与存储的相同的varbinary。这是我读回它的方式:var base64 = pm.SponsorImg != null ? Encoding.ASCII.GetString(pm.SponsorImg) : String.Empty; 我需要继续以这种方式读回,因为图像将被手动转换并通过 Angular 上传。
  • Encoding.ASCII.GetString(varbinary) 似乎有问题。如果 varbinary 是您的数据并且您想要一个 base64 编码的字符串,您应该使用 Convert.ToBase64String 将字节数组转换为。您所说的二进制输入是字符串的二进制表示(即字节表示 ascii 字符,而不是 base64 编码的字节)。
  • @stackoverflow.com/users/338068/chris ,您似乎提供了答案。很抱歉,我一开始没有理解您的建议。不知道如何给你更多的功劳 - 谢谢你的帮助。

标签: c# sql-server


【解决方案1】:

这对我有用:

var image = Convert.FromBase64String(base64);
string hex = BitConverter.ToString(image);
hex = hex.Replace("-", "");
hex = "0x" + hex;

此十六进制可以保存在 varbinary(MAX) 字段中,无需转换或转换,并将在浏览器中显示为图像。

【讨论】:

  • 有与此等价的 PHP 吗?
  • 我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多