Сохранение изображений в виде BLOB-объектов с базой данных Typeorm Cordova - PullRequest
0 голосов
/ 29 мая 2018

Конспект
Мои изображения неправильно сохраняются в моей базе данных 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-объектов / байтового массива в базе данных или есть способ конвертировать сохраненную строкувернуться к отображаемому изображению?

Заранее спасибо!

1 Ответ

0 голосов
/ 02 августа 2018

Я наконец смог заставить это работать в sqljs с typeorm.Вот метод преобразования в строку base64 для отображения данных буфера, поступающих из базы данных.

 BufferToBase64(buffer) {
    var binary = '';
    var byte = new Uint8Array( buffer );
    var byteLen = byte.byteLength;
    for (var i = 0; i < byteLen; i++) {
        binary += String.fromCharCode( byte[ i ] );
    }
    return window.btoa( binary );
}

Затем найдите способ отображения строки base64.В моем случае все, что мне нужно было сделать, это установить префикс изображения, а затем передать метод.Вот пример

<img [src]="'data:image/png;base64,'+BufferToBase64(graphic)" />

Ключевым моментом является преобразование байта [] в base64.Приветствия.

...