【问题标题】:Converting from base64 string to varbinary(max) in SQL Server在 SQL Server 中从 base64 字符串转换为 varbinary(max)
【发布时间】:2014-09-17 17:49:37
【问题描述】:

我将 PDF 文档以二进制形式存储在我的表中,存储 PDF 字节的列是类型 varbinary(max)。我想update 在 SQL Studio 中更新文档的一条记录,我尝试完成此操作的方式如下所示

UPDATE table
SET file_bytes=CONVERT(varbinary(max),'JVBERi0xLjYNCiW2JqDQo8PC9UeX...0YNCg==') --this is a base64 string
WHERE id='73c75254-ad86-466e-a881-969e2c6e7a04';

查询运行,但是当我尝试(通过网站)下载文档时,它会抛出一条错误消息,内容为 PDF header signature not found.

这种转换是否可能?

【问题讨论】:

  • 网站应该添加正确的文件/mime 类型的标题,不是吗?
  • 是的,我通过网络服务上传的文件下载正常。这是网站有Response.ContentType = "application/pdf" Response.AppendHeader("Content-Disposition", "attachment; filename=" & packetName.Replace(".", "_")) Response.BinaryWrite(mergedPdfBytes) Response.End()
  • 我认为您需要将该代码放在问题中(而不是评论),并描述 Web 服务与数据库更新的不同之处。另外你是怎么想出那个'JVBER...'字符串的,它应该是N'JVBER...'吗?您还确定要将 PDF 文件存储在 VARBINARY(MAX) 列中吗?大多数人在文件系统或使用 Filestream 或 FileTable 时运气更好......
  • Windows 应用程序将 PDF 转换为 base64 并将其传递给 Web 服务,该服务将 PDF base64 放入字节数组中,然后只是存储过程中的插入命令。 webservice 代码看起来像这样cmd.Parameters.Add("@file_bytes", SqlDbType.Binary).Value = fileData.Bytes; ....这个应用程序已经在生产中,所以改变数据类型不是一个选项
  • 所以尝试更改您的更新以在字符串上使用 N 前缀 - 我敢打赌它是 Unicode(如果您没有正确添加前缀,就会丢失它)。

标签: sql sql-server pdf base64 varbinary


【解决方案1】:

可以使用此处描述的方法:https://blogs.msdn.microsoft.com/sqltips/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa/

这是一个两步过程,首先你声明一个变量:

declare @str varchar(max) = '/9j/4AAQSkZJRgABAQEAAAAAAAD/==';

然后您可以在 SQL 语句中使用该变量,如下所示:

INSERT INTO Documents (Name, Body, MIMEType)
VALUES('12446_photo.jpg', cast(N'' as xml).value('xs:base64Binary(sql:variable("@str"))', 'varbinary(max)'), 'image/jpeg');

【讨论】:

  • 你不需要这个变量。 cast('/9j/4AAQSkZJRgABAQEAAAAAAAD/==' as xml).value('xs:base64Binary(.)', 'varbinary(max)') 由于base64中的每个字符都被认为是xml中的文本,所以整个字符串变成了一个文本节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多