将二进制文件转换为JavaScript字符串,然后转换为Uint8Array

将二进制文件转换为JavaScript字符串,然后转换为Uint8Array,javascript,sqlite,character-encoding,arraybuffer,uint8array,Javascript,Sqlite,Character Encoding,Arraybuffer,Uint8array,我正在尝试创建一个可以通过文件使用的web应用程序://URI。这意味着我不能使用AJAX加载二进制文件(如果不关闭浏览器中的安全功能,原则上我不想这样做) 应用程序使用SQLite数据库。我想将数据库提供给构造函数,构造函数要求它采用Uint8Array格式 因为我不能使用AJAX加载数据库文件,所以我可以使用和FileReader.prototype.readAsArrayBuffer加载它,并将数组Buffer转换为Uint8Array。这是使用以下代码: input.addEventLi

我正在尝试创建一个可以通过
文件使用的web应用程序://
URI。这意味着我不能使用AJAX加载二进制文件(如果不关闭浏览器中的安全功能,原则上我不想这样做)

应用程序使用SQLite数据库。我想将数据库提供给构造函数,构造函数要求它采用
Uint8Array
格式

因为我不能使用AJAX加载数据库文件,所以我可以使用
FileReader.prototype.readAsArrayBuffer
加载它,并将
数组Buffer
转换为
Uint8Array
。这是使用以下代码:

input.addEventListener('change', function (changeEvent) {
  var file = changeEvent.currentTarget.files[0];
  var reader = new FileReader();
  reader.addEventListener('load', function (loadEvent) {
    var buffer = loadEvent.target.result;
    var uint8Array = new Uint8Array(buffer);
    var db = new sql.Database(uint8Array);
  });
  reader.readAsArrayBuffer(file);
});
input.addEventListener('change',函数(changeEvent){
var file=changevent.currentTarget.files[0];
var reader=new FileReader();
reader.addEventListener('load',函数(loadEvent){
var buffer=loadEvent.target.result;
var uint8Array=新的uint8Array(缓冲区);
var db=新的sql.Database(uint8Array);
});
reader.readAsArrayBuffer(文件);
});
但是,
需要用户交互,这很乏味

我想我可以通过使用构建工具将我的数据库文件转换为JavaScript对象/字符串,生成一个提供文件内容的“.js”文件,然后以某种方式将文件内容转换为
Uint8Array
,从而绕过无AJAX限制

伪代码:

//在Node.js中:
var fs=需要('fs');
var sqliteDb=fs.readFileSync('path/to/sqlite.db');
var string=convertbuffertojsstringdb;
fs.writeFileSync('build/db.js','var dbString=“'+string+'”;');
//在浏览器中(假设“build/db.js”已通过标记加载):
var uint8Array=convertStringToUint8ArraySomehow(dbString);
var db=新的sql.Database(uint8Array);
在Node.js中,我尝试了以下方法:

var TextEncoder=require('text-encoding')。TextEncoder;
var TextDecoder=require('text-encoding')。TextEncoder;
var sql=require('sql.js');
var string=newtextdecker('utf-8').decode(fs.readFileSync('path/to/sqlite.db'));
//此时,我会将'string'写入一个“.js”文件,但对于
//为了确定是否转换回Uint8Array
//如果可以,我将在Node.js中继续。。。
var uint8array=new textcoder().encode(字符串);
var db=新的sql.Database(uint8array);
db.exec('SELECT*fromtablename');
但是当我这样做时,我得到了错误“错误:数据库磁盘映像格式错误”

我做错了什么?这可能吗?当我通过
FileReader
加载同一文件时,数据库磁盘映像没有“格式错误”

这是使用以下代码:

input.addEventListener('change', function (changeEvent) {
  var file = changeEvent.currentTarget.files[0];
  var reader = new FileReader();
  reader.addEventListener('load', function (loadEvent) {
    var buffer = loadEvent.target.result;
    var uint8Array = new Uint8Array(buffer);
    var db = new sql.Database(uint8Array);
  });
  reader.readAsArrayBuffer(file);
});
但是,
需要用户交互,这是 单调乏味


使用当前的工作方法比尝试创建变通方法要简单。如果用户打算使用应用程序,用户可以从文件系统中选择文件来运行应用程序。

使用以下代码,我能够将数据库文件的内容传输到浏览器:

//在Node.js中:
var fs=需要('fs');
var base64=fs.readFileSync('path/to/sqlite.db','base64');
fs.writeFileSync('build/db.js','var dbString=“”+base64+”;”);
//在浏览器中(假设“build/db.js”已通过标记加载):
函数base64ToUint8Array(字符串){
var raw=atob(字符串);
var rawLength=raw.length;
var数组=新的Uint8Array(新的ArrayBuffer(rawLength));
对于(变量i=0;i
fs.readFileSync(/path/to/sqlite.db')的结果是什么?@guest271314结果是
string
的结果是什么?一个巨大的字符串(
string.length
3202320
)。尽管
var-uint8array=new textcoder().encode(字符串)是否将字符串编码回
Uint8Array
正确?注意,您可以使用
Blob
file
对象创建
.js
文件,方法是将
类型设置为
“应用程序/javascript”
请重新阅读我的问题。我需要将“sqlite.db”转换成一个字符串,这样我就可以将它以“.js”文件.Is”的形式发送到浏览器中,这样就可以使用下面的代码:“正确吗?不确定在
nodejs
上使用
filereader
的结果会有什么不同或为什么会不同?您可以使用
Blob
file
对象将字符串转换为
.js
文件,如中所示。如果您认为可以这样做,请在回答中演示。此外,我还在OP中添加了一个用例示例,请参见“Psuedocode:”下的代码。演示什么?将字符串转换为
.js
文件?或者将字符串转换为
Uint8Array
?我想知道需要什么样的代码才能将文件“sqlite.db”的内容转换为JS字符串,其中JS字符串可以通过“.JS”文件发送到浏览器,然后在浏览器中转换为
Uint8Array
。您所说的“更直接的方式”是什么意思?如果您的答案解决了问题,您可以接受自己的答案。我所说的“更直接的方式”是指“使用执行时间更快的数据URL以外的方式”。“使用执行时间更快的数据URL以外的方式”不相信这是可能的。您可以使用
blobURL
,但这不会持续到浏览器会话之后。我可以通过仅使用base64编码(没有数据URL部分)稍微简化解决方案。base64似乎是在文本上下文中发送二进制数据的一种方便格式,所以它对我来说很有意义。您可以在不使用
FileReader
的情况下达到要求,是吗?并从
数据URI中删除10-20个字符