Я пытаюсь создать веб-приложение, которое можно использовать с помощью URI file://
. Это означает, что я не могу использовать AJAX для загрузки двоичных файлов (без отключения функций безопасности в браузере, что я не хочу делать в принципе).Преобразование двоичного файла в строку JavaScript, а затем в Uint8Array
Приложение использует базу данных SQLite. Я хочу предоставить базу данных конструктору sql.js, который требует его в формате Uint8Array
.
Поскольку я не могу использовать AJAX для загрузки файла базы данных, я мог бы вместо того, чтобы загрузить его с <input type="file">
и FileReader.prototype.readAsArrayBuffer
и преобразовать ArrayBuffer
в 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 type="file">
требует взаимодействия с пользователем, который является утомительным.
Я думал, что смогу обойти ограничение no-AJAX с помощью инструмента построения для преобразования моего файла базы данных в объект/строку JavaScript и сгенерировать файл .js, содержащий содержимое файла, а затем конвертировать содержимое файла до Uint8Array
, так или иначе.
Psuedocode:
// 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 + '";');
// 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, я попробовал следующее:
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
.
Что является результатом 'fs.readFileSync («путь/к/sqlite.db») '? – guest271314
@ guest271314 В результате получается ''. –
Jackson
Каков результат 'string'? – guest271314