ReactJS — FileReader считывает исходный буфер файла изображения

#reactjs #filereader

#reactjs #программа чтения файлов

Вопрос:

В предыдущем посте я получил помощь в его работе node.js в качестве доказательства концепции преобразования локальных изображений в двоичные буферные массивы, но слишком поздно понял, что я не смогу использовать fs in react для завершения преобразования моего локального файла изображения. Я пытался использовать FileReader() в качестве обходного пути, но безуспешно. Все, что я пробовал, привело к следующему сообщению об ошибке.

  Failed to execute 'readAs*******' on 'FileReader': parameter 1 is not of type 'Blob'.
  

Хотя в документации говорится, что он может принимать файл или большой двоичный объект, но я получаю эту ошибку при попытке манипулировать файлом.

Вот мой исходный код.

 import React, { useState } from "react";
import { Button, Container, Row, Col } from "react-bootstrap";
import "../../styling/FacialRecognition.css";

function FacialRecognition() {
    const [image, setImage] = useState("");

    function ProcessImage(localImage) {
       
        var reader = new FileReader();
        var imageTransformation = reader.readAsDataURL(
            localImage
        );
        console.print(imageTransformation);
    }
    return (
        <div>
            <Container fluid="xl">
                <Row>
                    <Col xs="auto">
                        <p>
                            Select a local image, and then click the
                            <b>Analyze face button.</b>
                        </p>
                    </Col>
                </Row>
                <Row>
                    <Col x="auto">
                        <label>Image to analyze: </label>
                        <input
                            type="file"
                            name="inputImage"
                            id="inputImage"
                            autoComplete="off"
                            onChange={(e) => setImage(e.target.value)}
                            style={{ width: "60%", marginLeft: "1vw" }}
                        />
                        <Button
                            variant="info"
                            onClick={() => ProcessImage(image)}>
                            Analyze face
                        </Button>
                    </Col>
                </Row>
            </Container>
        </div>
    );
}

export default FacialRecognition;
  

Я удалил все вызовы API, и теперь я просто хочу распечатать binaryArrayBuffer на консоль. Когда это выяснится, будет достаточно просто подключить его к моему вызову axios api.

Другие изменения, которые я пробовал у других пользователей с аналогичными проблемами:

   function ProcessImage(localImage) {
           
            var reader = new FileReader();
    
            var fileToRead = document.getElementById("inputImage").files[0];
    
            reader.addEventListener("loadend", function () {});
    
            var imageTransformation = reader.readAsArrayBuffer(fileToRead);
            console.log(imageTransformation);
        }
  

и

     function ProcessImage(localImage) {
        var reader = new FileReader();

        reader.onload = () => {
            console.log(reader.result);
        };
        var imageTransformation = reader.readAsBinaryString(localImage);
        console.log(imageTransformation);
}
  

Оба приводят к одному и тому же parameter 1 is not of type Blob сообщению об ошибке.

Любая помощь или рекомендации по этому вопросу будут оценены.

Ответ №1:

Для ввода типа file onChange у вас есть значение не в e.target.value , а в массиве in e.target.files . Вы можете получить доступ к большому двоичному объекту за одну загрузку e.target.files[0] . Объект будет иметь тип файла, к которому вы можете получить доступ и работать с ним.

  onChange={(e) => setImage(e.target.files[0])}
  

это должно устранить проблему.

Комментарии:

1. Конечно!! Я использовал его для хранения URL-адреса для моей предыдущей итерации. Большое вам спасибо, что указали на это!