使用Typeorm Cordova数据库将图像保存为Blob

时间:2018-05-29 18:44:34

标签: database sqlite cordova ionic-framework typeorm

概要
我的图片没有正确保存到我的Cordova SQLite数据库中。我正在使用typeorm。数据(Uint8Array)被转换为字符串,因此我无法再将其解码回来。

长版
我通过typeorm:

将以下Uint8Array保存到我的Cordova SQLite数据库中
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,...]

我再次获得的是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 for SQLite进行检查,以验证问题是在insert语句中而不在select中。

在我的实体中,图像字段定义如下:

@Column("blob",{ 
    nullable:true,
    name:"graphic"
})
graphic: Buffer;

我在这方面苦苦挣扎了两个星期,并尝试了几种不同的方法。

问题
所以我的问题浓缩为:是否有任何技巧或解决方法将图像/文件保存为数据库中的真正blob /字节数组,或者有没有办法将保存的字符串转换回可显示的图像?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我终于能够使用typeorm在sqljs中使用它。这是转换为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)" />

关键是将byte []转换为base64。干杯。