tldr;
Данные уже являются двоичными, поэтому отключите функции binaryX () и сохраните содержимое непосредственно в файл.Прочитайте первые несколько байтов двоичного файла, чтобы проверить тип файла.В этом случае оказывается, что документ действительно был сохранен в формате GZIP, а не в необработанном формате DOCX.
Не заблуждайтесь по поводу того, как SSMS выбирает его для отображения.SSMS отображает двоичный файл в удобном для пользователя шестнадцатеричном формате, но он все еще сохраняется в двоичном виде.Просто запишите двоичный файл прямо в файл, без каких-либо функций BinaryX.
<cfset FileWrite("C:\decodedfile.docx", contents)>
Кроме того, проверьте настройки DSN и убедитесь, что параметр « BLOB - Включить двоичный поиск больших объектов (BLOB) » включен, поэтому двоичные значения не усекаются при 64K (размер буфера по умолчанию).
Обновление 1:
Приведенный выше код FileWrite () работает правильно, если в столбце «содержание» содержится двоичный файл действительного файла .docx.Возможно, данные хранятся не так, как мы думаем?Запустите запрос, чтобы получить двоичный файл одного документа и вывести первые четыре байта.Что в итоге?Как правило, первые четыре байта файлов .docx должны быть 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>