Преобразование данных изображения MSSQL/столбца varbinary в файл

У меня есть данные с (неизвестного) сервера MSSQL в столбце типа Image (думаю, это старый вариант varbinary).

Я хочу создать сценарий (желательно на Python или Typescript, но открытый для чего угодно), который может принимать данные, подобные тем, что указаны в приведенной ниже сути, и выдавать файлы.

Я попробовал несколько подходов, но не смог преобразовать файл, указанный ниже: преобразованный файл повреждается. Полагаю, это связано с моими недостатками в навыках кодирования/конвертирования.

https://gist.github.com/tomfa/2f9e63ee1cc3cd012ac4c9b1031de39f

Мой код

Ниже приведена моя попытка декодирования данных с помощью Python. Код работает нормально, но выходной PDF-файл недействителен.

import binascii

s = open("data.dat").read()

# chop off the '0x' at the front.
s = s[2:]

# Decode hex to binary.
binary = binascii.unhexlify(s)

with open("test123.pdf", 'wb') as f:
    f.write(binary)

Пожалуйста, укажите свой подход, чтобы увидеть, где вы ошибаетесь

siggemannen 01.07.2024 18:08

«столбец типа Image (думаю, это старый вариант varbinary)». image является устаревшим типом данных и существует с 2005 года. Вам давно следовало перейти на varbinary(MAX), который заменил image.

Thom A 01.07.2024 18:16

КАК здесь связана случайная ссылка на GitHub? Если вы хотите включить информацию, включите ее в вопрос. Ссылка не указана ни в каком контексте и поэтому не имеет значения.

Thom A 01.07.2024 18:17

@ThomA Да, это уже давно устарело. Я пытаюсь извлечь данные из старой базы данных. Суть Github актуальна, поскольку она включает примеры данных, которые я не могу преобразовать. Это ~ 200 КБ, следует ли мне включить его сюда?

tomfa 01.07.2024 18:22

Вы можете загружать изображения в Stack Overflow, да. Нам также необходимо увидеть ваши попытки; мы не можем объяснить, почему это не работает, если вы не знаете, что это за попытки.

Thom A 01.07.2024 18:29

@siggemannen Добавлен подход, который у меня не работает. Я также добавил исходный PDF-файл в суть, если это полезно.

tomfa 01.07.2024 20:16

Не нужно делать ни # chop off the '0x' at the front ни binascii.unhexlify(s) бинарник в sql сервере просто бинарный, никаких манипуляций не нужно, просто читаем и записываем. То, что вы видите при запросе, обычно представляет собой шестнадцатеричную версию для женщин, сделанную так, чтобы она выглядела читабельной. Кроме того, почему вы читаете из файла, а не с сервера sql в своем коде?

siggemannen 01.07.2024 20:47

@siggemannen Мне кажется, вы предлагаете код Python ниже? Это просто воссоздает файл? ``` s = open("data.dat").read() с open("test123.txt", 'w') как f: f.write(s) ``` Я был бы очень признателен, если бы вы любой пример кода, который работает для связанного кода, на любом языке.

tomfa 01.07.2024 22:09

Но вы читаете не из файла в своем «реальном коде», а с sql-сервера? Или я что-то упускаю, или вы действительно записали данные с сервера sql в файл и теперь хотите прочитать из файла?

siggemannen 01.07.2024 22:10

@siggemannen Я готов на все. Я также написал приведенный ниже код для чтения с сервера, но я не включил его, поскольку никто другой не может протестировать/проверить его самостоятельно. Вот этот код, если интересно: gist.github.com/tomfa/859a4ab265f159a86da6345eff045266

tomfa 01.07.2024 22:18

Чтобы ответить на ваш вопрос @siggemannen: мне просто нужно экспортировать старую базу данных. так что мой «настоящий код» — это всего лишь одноразовый сценарий. Другими словами, не важно, какой язык или метод используется для преобразования данных.

tomfa 01.07.2024 22:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
11
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, поле изображения было заархивировано, и данные необходимо было разархивировать, прежде чем их можно будет прочитать.

from os import getenv
import pymssql
import zipfile

conn = pymssql.connect('server', 'user', 'password', 'database')
cursor = conn.cursor()
cursor.execute("""
SELECT %s, %s FROM %s;
""" % ('filename_column', 'image_column', 'table'))

def unzip(archive):
    with zipfile.ZipFile(archive, 'r') as zip:
        for file in zip.namelist():
            zip.extract(member=file)

row = cursor.fetchone()
while row:
    filename = row[1]
    imagedata = row[2]
    zip_path = f'./{filename}.zip'

    with open(zip_path, 'wb') as f:
        print("Writing %s" % filename)
        f.write(imagedata)

    unzip(zip_path)

    row = cursor.fetchone()

conn.close()

Другие вопросы по теме