【发布时间】: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