【问题标题】:Converting SQL Binary Content to File将 SQL 二进制内容转换为文件
【发布时间】:2018-11-03 00:54:42
【问题描述】:

我有一个将文件内容存储在表中的 SQL Server 数据库。具体来说,有2个字段:

  • 内容:varbinary(max) 始终以“0x1F.....”开头的字段

  • FileType:varchar(5)字段,文件类型,如PDF、docx等

如何将内容转换回文件?如果可能的话,我正在尝试使用 Coldfusion 进行转换。如果没有,将二进制文件转换为文件的步骤是什么?

我尝试了以下方法(假设是 docx 文件类型),但没有生成有效的 word 文件:

<cfset DecodedValue = BinaryDecode(contents,"hex")>
<cffile action="WRITE" output="#DecodedValue#" file="C:\decodedfile.docx">

【问题讨论】:

  • 您尝试了binaryDecode(),但该函数将字符串转换为二进制数据。你想要相反的。尝试改用binaryEncode()

标签: sql coldfusion hex varbinarymax


【解决方案1】:

感谢用户 Ageax,前 4 个大小字节 31,-117,8,0 显示内容以 GZIP 格式存储。

我首先将内容保存为 gzip,然后解压缩文件。我的代码如下:

<cfquery name="getfile" datasource="tempdb">
select content from table
</cfquery>

<cfset FileWrite("C:\mygzipfile.gzip", getfile.content)>

为了使用 Coldfusion 将 gzip 解压到文件中,我使用了以下解决方案:http://coldfusion-tip.blogspot.com/2012/04/unzip-gz-file-in-coldfusion.html

【讨论】:

  • 这更有意义。感谢您发布解决方案!
【解决方案2】:

tldr;

数据已经是二进制的,所以放弃 binaryX() 函数并将内容直接保存到文件中。读取二进制文件的前几个字节以验证文件类型。在这种情况下,文档实际上是以 GZIP 格式存储的,而不是原始 DOCX。


不要被 SSMS 选择显示它的方式所误导。 SSMS 以用户友好的十六进制格式显示二进制,但仍以二进制形式存储。只需将二进制文件直接写入文件,无需任何 BinaryX 函数。

<cfset FileWrite("C:\decodedfile.docx", contents)>

另外,检查您的 DSN 设置并确保“BLOB - 启用二进制大对象检索 (BLOB)”设置已启用,因此二进制值不会在 64K(默认缓冲区大小)处被截断。

更新 1:

如果“内容”列包含有效 .docx 文件的二进制文件,则上面的 FileWrite() 代码可以正常工作。也许数据的存储方式与我们想象的不同?运行查询以检索单个文档的二进制文件并输出前四个字节。结果是什么?通常,the first four bytes of .docx files 应该是 80, 75, 3, 4

<!--- print size and first 4 bytes --->
<cfoutput>
    size in bytes = #arrayLen(qYourQuery.contents)#<br>
    <cfloop from="1" to="4" index="x">
        byte #x# = #qYourQuery.contents[1][x]#<br>
    </cfloop>
</cfoutput>

更新 2:

我能找到的最接近1F 8B 08 的是 GZIP。尝试在保存的文件上使用probeContentType()。它报告了什么?

<cfscript>
    paths = createObject("java", "java.nio.file.Paths");
    files = createObject("java", "java.nio.file.Files");
    input = paths.get("c:/yourFileName.docx", []);
    writeDump(files.probeContentType(input));
</cfscript>

【讨论】:

  • 谢谢,是的,我现在意识到了这一点。我使用了上面的代码,但它没有生成有效的文件。我也在 DSN 设置中启用了 BLOB/CLOB。
  • 如何将数据插入数据库?在 CF11 中,它适用于 76kb 的文件。测试步骤 1) 使用FileReadBinary() 读入文件 2) 使用cfqueryparam cfsqtype=cf_sql_blob 插入 3) CFQuery 数据 4) 使用FileWrite(path, query.contentsColumn) 保存到文件。
  • 很遗憾,我没有此信息,因为我只是继承了此数据库并尝试将此内容转换回文件。
  • 也许它的存储方式与我们想象的不同。 1.用记事本之类的东西打开保存的文件。你看到了什么? 2. 你有没有像 MiguelF 建议的那样尝试 BinaryEncode?​​span>
  • 在记事本中打开文件,我可以看到乱码:‹ì»S°(K´-¸´—mÛ¶mÛ¶mÛ¶mÛk/Û¶mÛï。如果我使用二进制编码(十六进制或base64),我看到相关的数据表示形式,例如:1F8B080000000000...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多