Конспект
Мои изображения неправильно сохраняются в моей базе данных Cordova SQLite.Я использую typeorm.Данные (Uint8Array) преобразуются в строку, так что я не могу декодировать их снова.
Длинная версия
Я сохраняю следующий массив Uint8Array в моей базе данных Cordova SQLite с помощью typeorm:
Uint8Array(4144617) [255, 216, 255, 224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 0,
0, 1, 0, 1, 0, 0, 255, 219, 0, 67, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 255, 219,...]
и получаю обратноout снова имеет тип string:
���� JFIF �� C �� C...
Когда я преобразую это через Buffer.from(image)
в массив Uint8Array, он почти удвоил свой размер:
Uint8Array(7723287) [239, 191, 189, 239, 191, 189, 239, 191, 189, 239, 191,
189, 0, 16, 74, 70, 73, 70, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 239, 191, 189, 239,
191, 189, 0, 67, 0, 1, 1, 1, 1,...]
Приведенная выше строка является той же Uint8Arrayпредставление, как если бы я распечатал его как строку для консоли.Я пробовал разные кодировки (utf8, ascii, windows-1253, utf-16le), чтобы декодировать эту строку обратно в массив Uint8Array, но все выдают больше, чем было раньше.Сообщение журнала для вставок выглядит просто отлично:
query: INSERT INTO someEntity (id, name, created, createdby,
lastchangedby, lastchanged, status, graphic) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
-- PARAMETERS: ["1","some name","2018-05-28T22:46:38.896Z","username","username",
"2018-05-28T22:46:38.896Z","1",
{"type":"Buffer","data":[255,216,255,224,0,16,74,70,73,70,0,1,1,0,0,1,0,1,0,0,255,219,0,67,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,255,219,...]]
Но результатом в базе данных всегда является строка, независимо от того, какой метод я использую:
connection.manager.query("INSERT INTO ... (...) VALUES (?, ?, ...)", [parameters...])
connection.manager.save(entity)
connection.manager.createQueryBuilder().insert().into(entity).values({parameters...}).execute()
Я вытащил базу данных со своего устройства Android и проверил ее с помощью DB Browser для SQLite, чтобы убедиться, что проблема заключается ввставить оператор, а не в select.
В моей сущности поле изображения определяется следующим образом:
@Column("blob",{
nullable:true,
name:"graphic"
})
graphic: Buffer;
Я борюсь с этим в течение 2 недель и пробовал несколько разных подходов.
Вопрос
Итак, мои вопросы сводятся к следующему: есть ли хитрость или обходной путь для сохранения изображений / файлов в виде настоящих BLOB-объектов / байтового массива в базе данных или есть способ конвертировать сохраненную строкувернуться к отображаемому изображению?
Заранее спасибо!