Сохранить POST-ответ как файл в NativeScript - PullRequest
0 голосов
/ 15 марта 2020

В моем приложении NativeScript- Vue я делаю POST-запрос к своему серверу и получаю двоичный файл. Это файл .zip, содержащий файл .db, который я хочу скопировать и инициализировать с помощью плагина nativescript-sqlite.

Я использую ax ios, и ответ POST выглядит так:

"PK  {[oP'g�R     606.db�}`�����ו�N�-{�*�*�O炵W$�滓\(��t�KZ��dc2�e�C�Ĕ$�L
>b!��... and so on

Сейчас я тестирую на Android. Я сохраняю файл в папке Android Downloads, чтобы посмотреть, смогу ли я его распаковать. Я знаю, что File.write принимает собственный байтовый массив, поэтому я пытаюсь получить его из строки двоичного файла.

import * as fs from "tns-core-modules/file-system";

async function saveToFile(binary) { // binary = "PK  {[oP'g�R...

    let folder = fs.Folder.fromPath(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).getAbsolutePath());
    let zipFile = folder.getFile("Database.zip");

    // string to buffer
    let buffer = new ArrayBuffer(binary.length);
    let view = new Uint8Array(buffer);
    for (let i = 0; i < view.length; i++) {
        view[i] = binary.charCodeAt(i);
    }

    // buffer to native byte array
    let array = Array.create("byte", view.byteLength);
    for (let i = 0; i < view.byteLength; i++) {
        array[i] = new java.lang.Byte(view[i]);
    }

    await zipFile.write(array);
}

Я думаю, что я делаю что-то не так, циклически повторяя массивы два раза, в любом случае я в состоянии записать файл, но я не могу открыть его как .zip. Любая помощь?

1 Ответ

0 голосов
/ 16 марта 2020

Решено переключение с топора ios на модуль NativeScript HTTP, обрабатывающий непосредственно объект File вместо строки.

import { getFile } from "tns-core-modules/http";
import { Zip } from "nativescript-zip";

async function saveDatabaseToFile() {
    let folder = fs.knownFolders.temp();

    let zipFile = await getFile({
        method: "POST", // url, headers, content
    });
    await file.rename("Database.zip"); // extension was messed up

    await Zip.unzip({
        archive: file.path,
        directory: folder.path
    });

    let files = await folder.getEntities();
    let dbFile = files.find(file => file._extension === ".db");

    return dbFile;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...