Преобразование двоичного содержимого SQL в файл - PullRequest
0 голосов
/ 24 мая 2018

У меня есть база данных SQL Server, в которой хранится содержимое файлов в таблице.В частности, есть 2 поля:

  • Содержание: varbinary(max) поле, которое всегда начинается с '0x1F .....'

  • FileType: varchar(5) поле с типом файла, например PDF, docx и т. Д.

Как преобразовать содержимое обратно в файл?Я пытаюсь использовать Coldfusion, если это возможно, чтобы преобразовать его.Если нет, каковы шаги по преобразованию двоичного файла в файл?

Я попробовал следующее (предполагая тип файла docx), но он не выдал действительный файл слова:

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Благодаря User 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)>

Чтобы извлечь gzip в файл с помощью coldfusion, я использовал решение по адресу: http://coldfusion -tip.blogspot.com / 2012/04 / unzip-gz-file-в-coldfusion.html

0 голосов
/ 24 мая 2018

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>
...