Загрузка макета изображения в Cloudinary

В форме, которую я использую для загрузки обложки книги в Cloudinary, есть input type='file'. Однако я бы также хотел разрешить загрузку изображений, то есть, когда форма отправляется, в input type='file' нет файла. Cloudinary отвечает Request failed with status code 400.

Вот как я пытаюсь имитировать файл, чтобы загрузить его в Cloudinary внутри действия.

export const addBook = (bookData, history) => (dispatch) => {
    const cloudinaryUrl = 'https://api.cloudinary.com/v1_1/*****/upload';
    const cloudinaryUploadPreset = '*****';

    const formData = new FormData();

    bookData.cover[0] && formData.append('file', bookData.cover[0]);

    if (!bookData.cover[0]) {
        const blob = new Blob([''], { type: 'image/png' });
        blob['lastModifiedDate'] = '';
        blob['name'] = 'mockImageFile';
        blob['webkitRelativePath'] = '';
        blob['size'] = 7654;

        formData.append('file', blob);

        /* const f = new File([''], 'filename', { type: 'image/jpeg' });
        formData.append('file', f); */
    }

    formData.append('upload_preset', cloudinaryUploadPreset);

    axios({
        url: cloudinaryUrl,
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        data: formData
    })
... ...

Тем не менее Cloudinary отвечает Request failed with status code 400. Как мне убедить его взять программно созданный «файл»?

Цель состоит в том, чтобы обработать загрузку без файла.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
628
2

Ответы 2

Вам необходимо преобразовать данные большого двоичного объекта в URI данных, который будет принят параметром файла в методе загрузки Cloudinary.

Пожалуйста, попробуйте ниже кодовую базу для преобразования данных большого двоичного объекта в URI данных. который вы можете добавить в formdata.

const blob = new Blob([""],{ type: "image/png" }); blob["lastModifiedDate"] = ""; blob["name"] = "mockImageFile"; blob["webkitRelativePath"] = "";

blob["size"]=7654;

var reader = new FileReader();

var blob_base64data; reader.readAsDataURL(blob); reader.onloadend = function() { blob_base64data = reader.result; };formData.append("file", blob_base64data);

Что могло здесь вызвать ошибку TypeError: setting a property that has only a getter? Похоже, причиной этого стала установка реквизита на blob.

El Anonimo 30.12.2018 19:08

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

El Anonimo 30.12.2018 19:21

Пожалуйста, обратитесь: stackoverflow.com/questions/42386027/…

Tejas Mulay 30.12.2018 19:25

Я вернусь к этому завтра. Здесь уже поздно. Спасибо. JIC, вам любопытно, полное репо находится на github.com/ElAnonimo/booklister. Действие, которое использует загрузку Cloudinary, находится в client / src / action / bookActions.js -> addBook.

El Anonimo 30.12.2018 19:29

Ошибка TypeError: setting a property that has only a getter была вызвана blob['size'] = 7654. Тем не менее, Cloudinary все еще сообщает об ошибке. Когда вы записываете ваш blob_base64data в консоль, я получаю undefined.

El Anonimo 30.12.2018 21:59

Я переместил код вот так. let blob_base64data; reader.readAsDataURL(blob); reader.onloadend = function() { blob_base64data = reader.result; console.info('blob_base64data:', blob_base64data); formData.append('file', blob_base64data); }; blob_base64data подключает "data:image/png;base64," к консоли. Так должен выглядеть blob_base64data для пустого файла?

El Anonimo 30.12.2018 22:16

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

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