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

Database 使用Typeorm Cordova数据库将图像保存为blob,database,sqlite,cordova,ionic-framework,typeorm,Database,Sqlite,Cordova,Ionic Framework,Typeorm,简介 我的图像无法正确保存到Cordova SQLite数据库。我在用打字机。数据(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,

简介
我的图像无法正确保存到Cordova SQLite数据库。我在用打字机。数据(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,...]
我再次得到的是字符串类型:

���� 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)将这个字符串解码回UINT8数组,但都比以前产生了更多。 插入的日志消息看起来很好:

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(“插入到…(…)值(?,,…),[parameters…])
  • connection.manager.save(实体)
  • 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/字节数组,或者是否有方法将保存的字符串转换回可显示的图像


提前谢谢

我终于能够用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 );
}
BufferToBase64(缓冲区){
var二进制=“”;
var字节=新的Uint8Array(缓冲区);
var byteLen=byte.byteLength;
对于(var i=0;i
然后找到显示base64字符串的方法。在我的例子中,我所需要做的就是设置一个图像前缀,然后传递该方法。这是一个样品

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


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

请问您现在可以转换回图像了吗?不,不幸的是没有:/嘿,我也有同样的问题。我从外部服务器加载一个图像,请求的结果是一个有效的Blob对象,我可以像使用符咒一样使用它。但从db加载后,它只是一个object对象,调试后我发现,保存Blob的查询似乎只保存Blob的字符串,例如“{”size:123,“type”:“image/png”}。因此更新中有些可疑。。还尝试了其他东西,而不是blob,如buffer、arraybuffer。。那么您是如何保存blob的?我不想使用base64,原因是什么?您可以直接将blob用作源Url