Загрузка изображения base64 из Angular на сервер

Я пытаюсь загрузить изображение base64 из Angular в ExpressJS. Я использую html2canvas для создания изображения base64. Если я попытаюсь загрузить imageData в его текущей форме, я получу imageData.replace is not a function. Если я попытаюсь упорядочить это так в службе angular

const image = JSON.stringify(imageData);
const data = image.replace(/^data:image/\w+;base64,/, '');

Тогда я получаю Buffer is not a constructor Как я могу успешно загрузить его на сервер ExpressJS? Я ценю любую помощь!

Компонент

       
    ngAfterViewInit() {
        sleep(5000).then(() => {
            const table = document.getElementById('table');
            this.dataUrl = html2canvas(table).then(function (canvas) {
                const res = canvas.toDataURL();
                return res;
            });
            this.angularService.uploadImage('png', this.dataUrl);
        });
    }

Услуга

    uploadImage(contentType, imageData) {
        console.info("imageData", imageData)
        const headers = new HttpHeaders();
        if (contentType === 'jpeg') {
            headers.set('Content-Type', 'image/jpeg;');
        } else if (contentType === 'png') {
            headers.set('Content-Type', 'image/jpeg;');
        }

        const data = imageData.replace(/^data:image/\w+;base64,/, '');
        const buff = new Buffer(imageData, 'base64');
        return this.http.put(
            environment.slsLocal + '/update-image-url',
            buff.buffer,
            { headers: headers }
        );
    }

Console.info('imageData', imageData) в сервисе выглядит так

В обоих случаях вы устанавливаете для типа контента значение 'image/jpeg', но я не думаю, что это проблема. Вы вызываете функцию uploadImage вне then() функции sleep(). Итак, мне кажется, что uploadImage вызывается до того, как this.dataUrl установлено.

Geshode 11.01.2023 02:36

Я удалил подписку, потому что она не позволяет подписаться внутри цепочки обещаний. Теперь он распознает функцию. Те же ошибки, упомянутые ранее Buffer is not a constructor и imageData.replace is not a function, все еще происходят, поэтому ничего не изменилось. См. обновленное изображение и обновленный console.info в службе

user6680 11.01.2023 03:15
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
Как React Helmet спасает меня при разделении файлов CSS?
Как React Helmet спасает меня при разделении файлов CSS?
Многие новички могут столкнуться с проблемой, когда одна страница с CSS наследует свойства от другой страницы с другим CSS. У меня было много проблем,...
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Руководство для начинающих по веб-разработке: HTML, CSS и JavaScript.
Руководство для начинающих по веб-разработке: HTML, CSS и JavaScript.
Добро пожаловать, мои коллеги по интернету, в захватывающий мир веб-разработки! Дорогие мои начинающие, я здесь, чтобы провести вас через основы HTML,...
0
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть 2 проблемы.

  1. Html2canvas(table).then возвращает обещание. Не res. Вы должны вызвать this.angularService внутрь html2canvas(table).then.

  2. Я не уверен, что вы пытаетесь сделать с const buff = new Buffer(imageData, 'base64');. Если вы хотите загрузить содержимое base64, просто поставьте data.

Также обратите внимание, что вы должны subscribe вернуть this.http.put, потому что HTTP-запрос не будет отправлен на ваш сервер, если он не подписан.

Сложите это вместе.

Компонент

ngAfterViewInit() {
    sleep(5000).then(() => {
        const table = document.getElementById('table');
        html2canvas(table).then(function (canvas) {
            const res = canvas.toDataURL();
            this.dataUrl = res;
            this.angularService.uploadImage('png', this.dataUrl)
                .subscribe( result => {
                  // your logic
                } );
        });
    });
}

Услуга

uploadImage(contentType, imageData) {
    console.info("imageData", imageData)
    const headers = new HttpHeaders();
    if (contentType === 'jpeg') {
        headers.set('Content-Type', 'image/jpeg;');
    } else if (contentType === 'png') {
        headers.set('Content-Type', 'image/jpeg;');
    }

    const data = imageData.replace(/^data:image/\w+;base64,/, '');
    return this.http.put(
        environment.slsLocal + '/update-image-url',
        data,
        { headers: headers }
    );
}

Когда я перемещаю this.angularService.uploadImage внутрь .then(), я получаю ERROR Error: Uncaught (in promise): TypeError: this.angularService.uploadImage is not a function. Он не распознает его внутри then(). Он распознает это, потому что я вижу, что dataUrl передается службе, поэтому я не уверен, что проблема в этом.

user6680 11.01.2023 03:01

Те же ошибки, упомянутые ранее Buffer is not a constructor и imageData.replace is not a function, все еще происходят в тех же сценариях в посте, поэтому ничего не изменилось. См. обновленное изображение и обновленный console.info в службе

user6680 11.01.2023 03:16

Другие вопросы по теме