首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将二进制文件转换为JavaScript字符串,然后转换为Uint8Array

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

Stack Overflow用户
提问于 2016-09-26 20:28:03
回答 2查看 6.3K关注 0票数 3

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

应用程序使用SQLite数据库。我希望将数据库提供给sql.js构造函数,这需要Uint8Array格式的数据库。

由于无法使用AJAX加载数据库文件,所以可以使用<input type="file">FileReader.prototype.readAsArrayBuffer加载数据库文件,并将ArrayBuffer转换为Uint8Array。这与以下代码一起工作:

代码语言:javascript
复制
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 type="file">需要用户交互,这是乏味的。

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

Psuedocode:

代码语言:javascript
复制
// In Node.js:
var fs = require('fs');
var sqliteDb = fs.readFileSync('path/to/sqlite.db');
var string = convertBufferToJsStringSomehow(sqliteDb);
fs.writeFileSync('build/db.js', 'var dbString = "' + string + '";');
代码语言:javascript
复制
// In the browser (assume "build/db.js" has been loaded via a <script> tag):
var uint8Array = convertStringToUint8ArraySomehow(dbString);
var db = new sql.Database(uint8Array);

在Node.js中,我尝试了以下几种方法:

代码语言:javascript
复制
var TextEncoder = require('text-encoding').TextEncoder;
var TextDecoder = require('text-encoding').TextEncoder;
var sql = require('sql.js');

var string = new TextDecoder('utf-8').decode(fs.readFileSync('path/to/sqlite.db'));
// At this point, I would write `string` to a ".js" file, but for
// the sake of determining if converting back to a Uint8Array
// would work, I'll continue in Node.js...
var uint8array = new TextEncoder().encode(string);
var db = new sql.Database(uint8array);
db.exec('SELECT * FROM tablename');

但是当我这样做时,我会得到“错误:数据库磁盘映像格式错误”。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-27 04:54:06

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

代码语言:javascript
复制
// In Node.js:
var fs = require('fs');
var base64 = fs.readFileSync('path/to/sqlite.db', 'base64');
fs.writeFileSync('build/db.js', 'var dbString = "' + base64 + '";');
代码语言:javascript
复制
// In the browser (assume "build/db.js" has been loaded via a <script> tag):
function base64ToUint8Array (string) {
  var raw = atob(string);
  var rawLength = raw.length;
  var array = new Uint8Array(new ArrayBuffer(rawLength));
  for (var i = 0; i < rawLength; i += 1) {
    array[i] = raw.charCodeAt(i);
  }
  return array;
}
var db = new sql.Database(base64ToUint8Array(dbString));
console.log(db.exec('SELECT * FROM tablename'));
票数 3
EN

Stack Overflow用户

发布于 2016-09-26 21:08:14

这与以下代码一起工作: Input.addEventListener(‘changeEvent’){ var file = changeEvent.currentTarget.files;var reader =新的FileReader();reader.addEventListener('load',function (loadEvent) { var缓冲器= loadEvent.target.result;var uint8Array =新的Uint8Array(缓冲区);var db =新sql.Database(uint8Array);});reader.readAsArrayBuffer(file);}; 然而,<input type="file">需要用户交互,这是乏味的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39711827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档