React: как избежать проблем с производительностью при загрузке изображений в Cloudinary

Я написал код, который работает, но это не шедевр. У него огромные проблемы с производительностью. Как бы я с этим справился?

Проблемы

У меня проблемы с производительностью моего компонента:

  1. Отправка нескольких изображений происходит очень медленно, когда я отправляю 5 изображений, это занимает около 1-2 минут.
  2. Как я могу убедиться, что фотографии загружаются в Cloudinary только во время отправки? Потому что, например, когда пользователь выбирает фотографию А, а затем осматривается и выбирает фотографию Б, фотографии А и Б загружаются в облако.

Вопросы

Было бы неплохо отключить кнопку добавления альбома при передаче файлов в Cloudinary?

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

const AddAlbum = () => {

  const [fileUrl, setFileUrl] = useState();

  // MultipleFiles
  const [multipleFileUrl, setMultipleFileUrl] = useState([]);
 
  // cloudnary upload api endpoint
  const api_cloudinary =
    "https://api.cloudinary.com/v1_1/cloudinary_name/image/upload";

  
  // file upload
  const handleSingleFileUpload = async (files) => {
  

    const formData = new FormData();
    formData.append("file", files[0]);
    formData.append("upload_preset", "preset_number");
    // send cloudinary image and presets info
    const res = await fetch(api_cloudinary, {
      method: "POST",
      body: formData,
    });

    const file = await res.json();
    console.info(file);
    const fileUrl = await file.eager[0].url;
    setFileUrl(fileUrl);
  };
  console.info(fileUrl);
  // upload many files cloudnary
  // For now max amount of files is 20
  const handleMultipleFileUpload = async (files, amount) => {
    const formData = new FormData();

    for (let i = 0; i <= files.length; i++) {
      let file = files[i];
      formData.append("file", file);
      formData.append("upload_preset", ""preset_number"");

      const res = await fetch(api_cloudinary, {
        method: "POST",
        body: formData,
      });

      const cloudinaryFiles = await res.json();
      console.info(cloudinaryFiles);
      setMultipleFileUrl(cloudinaryFiles);
    }
  };

  const handleSubmit = async (e) => {
    e.preventDefault();
    console.info(
      `
      Album name:${albumName}
      color:${color}
      Background Image: ${fileUrl}
      files:${multipleFileUrl}
      `
    );
  };
 

И формы

 return (
    <Wrapper>
    
      <form onSubmit = {handleSubmit}>
       
    
        <div>
          <StyledLabel>Upload background image</StyledLabel>
          <DefaultInput
            type = "file"
            onChange = {(e) => handleSingleFileUpload(e.target.files)}
          />
        </div>
        <div>
          <StyledLabel>Upload background image</StyledLabel>
          <DefaultInput
            type = "file"
            onChange = {(e) => handleMultipleFileUpload(e.target.files)}
            multiple
          />
        </div>
       
        
        <StyledButton type = "submit">Submit</StyledButton>
      </form>
    </Wrapper>
  );
};
Поведение ключевого слова "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
808
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вам нужна только 1 функция для обработки 1 или более файлов изображений. Вам нужно получить содержимое каждого файла и загрузить содержимое файла в данные формы. Пример кода использует API FileReader браузера для чтения содержимого локальных файлов изображений. Посмотрите на этот код в repl.it, который использует vanilla JS. Если это имеет смысл, вы можете вписать его в свою структуру. Дайте мне знать, если есть вопросы. https://repl.it/@rpeltz/fe-upload#script.js

  reader.addEventListener(
      "load", function () {
        const fileContents = reader.result;


https://developer.mozilla.org/en-US/docs/Web/API/FileReader

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

Например, react-uploady делает это за вас. так что это просто:

import React from "react";
import Uploady from "@rpldy/uploady";
import UploadButton from "@rpldy/upload-button";

const CLOUD_NAME = "<your-cloud-name>";
const UPLOAD_PRESET = "<your-upload-preset>";

const App = () => (<Uploady
    destination = {{ 
        url: `https://api.cloudinary.com/v1_1/${CLOUD_NAME}/upload`,
        params: {
            upload_preset: UPLOAD_PRESET,
        }
    }}>
    <UploadButton/>
</Uploady>);

Для производственного кода, где вы не хотите разрешать неподписанные загрузки, я рекомендую посмотреть это руководство

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