繁体   English   中英

React-native Cloudinary 图像上传问题 state

[英]React-native Cloudinary image upload problem with state

我正在使用 react-native 和 EXPO CLI 构建一个应用程序,并且我有一个屏幕,我在注册过程中从用户那里获取图像/多张图像。 我想从用户的图库中获取图像,然后将其上传到 cloudinary 并生成 url,然后将此 url 推送到数据库中,然后在屏幕上呈现。

图像已成功上传到 Cloudinary,但它没有及时返回 url,当我将数据推送到数据库时,在“imagesUrl”state 中解析为空。 因此,基本上在 Cloudinary 中过了一段时间后,我看到了我的图像,但是在“图像”字段下的数据库中,我得到了一个空数组,该数组被设置为 state,当时它也是空的。 setState 工作不正常。

我的代码:

地方州:

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

  const [imagesUrl, setImagesUrl] = useState([]);

Function 负责从用户的图库中挑选图像:

 const pickImage = async () => {
    let result = await ImagePicker.launchImageLibraryAsync({
      mediaTypes: ImagePicker.MediaTypeOptions.All,
      allowsEditing: true,
      aspect: [4, 3],
      quality: 1,
    });

    if (!result.cancelled) {
      if (images.length < 6) setImages((prev) => [...prev, result]);
    }
  };

Function 负责上传到Cloudinary:

 const handleUploads = async (files) => {
    const formData = new FormData();

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

      const res = await fetch(`${CLOUDINARY_URL}/image/upload`, {
        method: "POST",
        body: formData,
      });

      const cloudinaryFiles = await res.json();
      setImagesUrl([...imagesUrl, cloudinaryFiles.url]);
    }
  };

Function 负责将用户上传的文件转换为正确的类型:

 const handleImagesType = (imgs) => {
    let newImages = [];
    imgs.forEach((img) => {
      newImages.push({
        uri: img.uri,
        type: `test/${img.uri.split(".")[1]}`,
        name: `test/${img.uri.split(".")[1]}`,
      });
    });
    return newImages;
  };

最后一个负责将数据推入数据库的function:

  const pushDataHandler = async (data) => {
    if (data.length) {
      const temp = handleImagesType(data);
      handleUploads(temp);
      await db.collection("users").doc(firebase.auth().currentUser.uid).update({
        images: imagesUrl,
      });
    }
  };

当用户按下按钮提交图像时:

  onPress={() => {
            pushDataHandler(images);
            dispatch(pullUserData()); //Pulling all the data of a user from DB to a redux state
  }}

这是OGcodes使用直接调用 Cloudinary Rest API 和ImagePicker 组件完成的完整示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM