create-реагировать-приложение javascript конвертировать файл в массив Uint8Array - PullRequest
2 голосов
/ 22 марта 2020

У меня есть приложение create-реагировать, которое обновляет прошивку подключенных устройств Bluetooth.

Для этого мне нужно преобразовать файл прошивки (.zip) в массив Uint8Array.

Файл прошивки сохраняется локально в моей папке public / folder

И поэтому я пытаюсь извлечь эти байты с помощью этой функции:

var fimware_zip = process.env.PUBLIC_URL + '/ZioV8_1.2.7.zip'    
this.loadFile(fimware_zip)

С помощью loadFile, определенного как:

  // Load a file, set the bytes to firmware_byte_array
  loadFile = async (my_file) => {

    console.log(my_file)
    var fr = new FileReader();

    fr.onload = (e) =>
    { 
      var arrayBuffer = e.target.result;
      var array = new Uint8Array(arrayBuffer);
      this.setState({ firmware_byte_array: array})
    }

    fr.readAsArrayBuffer(my_file);
  }

Однако я получаю следующую ошибку:

Unhandled Rejection (TypeError): Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'.

Я искал все выше и ниже, пытаясь найти способ преобразования файла в тип Blob, и я просто не могу это сделать.

Я также пытался поместить файл .zip в папку src / и импортировать его, используя

import fimware_zip from './ZioV8_1.2.7.zip'

Но это также не работает

Любая помощь будет с благодарностью

1 Ответ

2 голосов
/ 22 марта 2020

Вы можете использовать readAsArrayBuffer только для объектов Blob или File (например, тех, которые вы получаете от input type="file" элементов).

Я предполагаю, что какой-то серверный процесс вовлечен в это приложение, в этом случае вы можете использовать fetch:

const loadFile = async (my_file) => {
    const response = await fetch(my_file);
    if (!response.ok) {
        throw new Error("HTTP error " + response.status);
    }
    const array = new Uint8Array(await response.arrayBuffer());
    // ...use or return `array` here...
};
...