使用单个功能将多个图像转换为基础64

发布于 2025-01-23 03:58:49 字数 1676 浏览 4 评论 0原文

我正在处理一个问题,我必须将三张图像作为用户输入,并且必须通过将其转换为基本64来将其发送到后端。我知道如何为一个输入文件做,但不能为多个输入而努力。

我想拥有一个可以将图像转换为base64&的单个函数。将每个图像的值存储在单独的变量中。请帮助我。

以下是我用于单个输入IE 第一个图像的代码。

HTML代码

<div class="first_div">
     <label for="first_image">First Image</label>
     <input name="first_image" type="file" accept="image/*" id="first_image" class="img_file">
</div>

<div class="second_div">
     <label for="second_image">Second Image</label>
     <input name="second_image" type="file" accept="image/*" id="second_image" class="img_file">
</div>

<div class="third_div">
     <label for="third_image">Third Image</label>
     <input name="third_image" type="file" accept="image/*" id="third_image" class="img_file">
</div>

<button onclick="submitImages()">Submit</button>
                  

JavaScript代码

let encoded_image;

function getBase64(file) {
   var reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     console.log(reader.result);
     encoded_image = reader.result;
   };
   reader.onerror = function (error) {
     console.log('Error: ', error);
   };
}


const submitImages = () => {
   var files = document.getElementById('first_image').files[0];
   if (files.length > 0) {
    getBase64(files[0]);
   }

const formData = new URLSearchParams(new FormData());
formData.append("first_image", encoded_image);

fetch(API CALL HERE)

}

我想创建一个从所有三个字段中获取输入的函数,将它们转换为base64&amp;存储在变量中。这样我就可以将其附加到形成数据。

I'm working on a problem where I have to take three images as input from the user and have to send them to the backend by converting them into Base64. I know how to do it for a single input file but can't work my way around for multiple inputs.

I want to have a single function that can convert the images to Base64 & store the value of each image in a separate variable. Please help me out with this.

Following is the code I'm using for single input i.e. First Image.

HTML CODE

<div class="first_div">
     <label for="first_image">First Image</label>
     <input name="first_image" type="file" accept="image/*" id="first_image" class="img_file">
</div>

<div class="second_div">
     <label for="second_image">Second Image</label>
     <input name="second_image" type="file" accept="image/*" id="second_image" class="img_file">
</div>

<div class="third_div">
     <label for="third_image">Third Image</label>
     <input name="third_image" type="file" accept="image/*" id="third_image" class="img_file">
</div>

<button onclick="submitImages()">Submit</button>
                  

JAVASCRIPT CODE

let encoded_image;

function getBase64(file) {
   var reader = new FileReader();
   reader.readAsDataURL(file);
   reader.onload = function () {
     console.log(reader.result);
     encoded_image = reader.result;
   };
   reader.onerror = function (error) {
     console.log('Error: ', error);
   };
}


const submitImages = () => {
   var files = document.getElementById('first_image').files[0];
   if (files.length > 0) {
    getBase64(files[0]);
   }

const formData = new URLSearchParams(new FormData());
formData.append("first_image", encoded_image);

fetch(API CALL HERE)

}

I want to create a function that takes input from all three fields, converts them to Base64 & stores in a variable. So that I can append it to form data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

审判长 2025-01-30 03:58:49

选择所有输入,循环并获取每个文件的base64
尝试一下

  const getBase64 = (file) =>
    new Promise((resolve, reject) => {
      console.log(file);
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => resolve(reader.result);
      reader.onerror = (err) => reject(err);
    });

  const submitImages = async () => {
    const imageInputs = document.querySelectorAll("input");
    const images = await Promise.all(
      [...imageInputs].map((imageInput) =>
        imageInput?.files?.[0] ? getBase64(imageInput.files[0]) : null
      )
    );
    console.log(images);
  };

Select all inputs, loop and get base64 of each file
Try this

  const getBase64 = (file) =>
    new Promise((resolve, reject) => {
      console.log(file);
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => resolve(reader.result);
      reader.onerror = (err) => reject(err);
    });

  const submitImages = async () => {
    const imageInputs = document.querySelectorAll("input");
    const images = await Promise.all(
      [...imageInputs].map((imageInput) =>
        imageInput?.files?.[0] ? getBase64(imageInput.files[0]) : null
      )
    );
    console.log(images);
  };
终难愈 2025-01-30 03:58:49

此示例是在React中,但您可以轻松地将其修改为标准JavaScript。

如果是标准JavaScript,则只需更改const [images,setImages] = usestate([]); in 让images = []

const [images, setImages] = useState([]);

const formatImage = async() => {
  try {
    for (let i = 0; i < e.target.files.length; i++) {
      const reader = new FileReader();
      reader.readAsDataURL(e.target.files[i]);
      reader.onload = (readerEvent) => {
        images.push(readerEvent.target ? .result);
      };
    }
  } catch (error) {
    console.log(error);
  }
};
<input type="file" multiple onChange={formatImage} />

这是将这些图像放在Firebase Firestore上的一个示例,如果它是标准JavaScript Change setImages([]) images = []

const addImage = async() => {
  try {
    Promise.all(
      images.map(
        async(file: any) =>
        await addDoc(collection(db, "images"), {
          image: file,
          date: Timestamp.now(),
        })
      )
    );

    setImages([]);
  } catch (error) {
    console.log(error);
  }
};

This example is in React but you can easily modify it to standard javascript.

If it's standard javascript just change const [images, setImages] = useState([]); into let images = [].

const [images, setImages] = useState([]);

const formatImage = async() => {
  try {
    for (let i = 0; i < e.target.files.length; i++) {
      const reader = new FileReader();
      reader.readAsDataURL(e.target.files[i]);
      reader.onload = (readerEvent) => {
        images.push(readerEvent.target ? .result);
      };
    }
  } catch (error) {
    console.log(error);
  }
};
<input type="file" multiple onChange={formatImage} />

And here is an example of putting these images on Firebase Firestore and again if it's standard javascript change setImages([]) to images = []

const addImage = async() => {
  try {
    Promise.all(
      images.map(
        async(file: any) =>
        await addDoc(collection(db, "images"), {
          image: file,
          date: Timestamp.now(),
        })
      )
    );

    setImages([]);
  } catch (error) {
    console.log(error);
  }
};

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文