当前位置: 首页 > 知识库问答 >
问题:

将更多图像从react本机应用程序上载到firebase

佟和平
2023-03-14

我试图上传多个图像从反应本机到Firebase。我这样做的方式是通过使用博览会图像选择器多-由monstrodev(见snack.io这里)

我已经设法让它工作,并设法能够选择多张照片从'即兴'相机辊。它们在添加屏幕中加载良好,但我找不到如何正确上传它们的解决方案。

        export default function Add(props) {

        const [name, setName] = useState("");
        const [photos, setPhotos] = useState(null);



        const uploadImage = async () => {
        const uri = photos[0].uri; // -> uri is like this because 'media' is an array with objects inside that contain name, type, and uri each, and I only need uri of each oject.
        const childPath = `data/${firebase.auth().currentUser.uid}/${Math.random().toString(36)}`;
        console.log(childPath);
        const response = await fetch(uri);
        const blob = await response.blob();

        const upload = firebase
            .storage()
            .ref()
            .child(childPath)
            .put(blob);

        const uploadProgress = snapshot => {
            console.log(`transferred: ${snapshot.bytesTransferred}`)
            };


            const uploadComplete = () => {
                    upload.snapshot.ref.getDownloadURL().then((snapshot) =>{
                        addPost(snapshot);
                        console.log(snapshot);
                    })
            };

            const uploadError = snapshot => {
                console.log(snapshot);
            };

            upload.on("state_changed", uploadProgress, uploadError, uploadComplete );

            
            };



        const addPost = (downloadURL) => {  
            firebase.firestore() 
            .collection("allPosts")
            .collection(firebase.auth().currentUser.uid)
            .collection('userPosts')
            .add({
            
                downloadURL,
                name,
            }).then((function () {
                props.navigation.popToTop()
            }))
        } 


        useEffect(() => {
        const {params} = props.route;
        if(params) {
        const {photos} = params;
        if(photos) setPhotos(photos)
        delete params.photos
        }

        }, [{photos}]) // This useEffect updates when coming back from the ImageBrowserScreen (can be found in snack.io, it's exactly the same) 

主要问题是,这么说吧,我选3张照片。如果我console.log(照片),我会得到这个:

  Array [
   Object {
    "name": "name1.JPG",
    "type": "image/jpg",
    "uri": "file:///name1.jpg",
   },
   Object {
    "name": "name2.JPG",
    "type": "image/jpg",
    "uri": "file:///name2.jpg",
   },
   Object {
    "name": "name3.JPG",
    "type": "image/jpg",
    "uri": "file:///name3.jpg",
   },
  ]

我唯一能让它工作的是这个,给uri确切的路径(例如照片[0]. uri),否则会出现网络错误。但这只上传第一个对象/照片。我还试图通过照片状态映射,并将所有uri返回到一个数组中,并将其用作const uri,但这显然不起作用,因为uri只需要一个字符串。因此,我需要为每个uri运行该函数,以便能够获得一个下载URL并存储它们。

编辑:

const uploadImage = async (photo) => {
const uri = photo.uri;
const childPath = `data/${
  firebase.auth().currentUser.uid
}/${Math.random().toString(36)}`;
console.log(childPath);
const response = await fetch(uri);
const blob = await response.blob();

const snapshot = await firebase.storage().ref().child(childPath).put(blob);
const downloadURL = await snapshot.ref.getDownloadURL();
imgs.push(downloadURL)
};

 const uploadPhotos = async () => {
  await Promise.all(photos.map(p=>uploadImage(photo)).then(addPost())
};

共有1个答案

嵇浩淼
2023-03-14

你能不能用一个循环试试,把所有的照片分开上传。理想地使用Promise.all并行上传它们:


 const addPost = async (downloadURLs) => {  
            await firebase.firestore() 
            .collection("allPosts")
            .collection(firebase.auth().currentUser.uid)
            .collection('userPosts')
            .add({
                downloadURLs,
                name,
            })
     props.navigation.popToTop()
        } 

  const uploadImage = async (photo) => {
    const uri = photo.uri;
    const childPath = `data/${
      firebase.auth().currentUser.uid
    }/${Math.random().toString(36)}`;
    console.log(childPath);
    const response = await fetch(uri);
    const blob = await response.blob();

    const snapshot = await firebase.storage().ref().child(childPath).put(blob);
    const downloadURL = await snapshot.ref.getDownloadURL();
    return downloadURL
  };

  const uploadPhotos = async () => {
      const downloadURLs=await Promise.all(photos.map(p=>uploadImage(photo))

      await addPost(downloadURLs);
  };
 类似资料:
  • 我试图从react native应用程序上传一个映像到java spring boot服务器,但我无法使其工作。 路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;嵌套异常为org.springframework.web.multipart.multipartException:解析多部分servlet请求失败;嵌套

  • 我学习AWS和Flutter为大学的一个主题开发一个移动应用程序(Android),比如Instagram。 我的问题是,是否有一种方法可以直接将图像从应用程序发送到S3 Bucket,并将与该图像相关的URL存储在Dynamodb中。 我将感激任何形式的指导,因为我是AWS的新手。

  • 我尝试从数组中随机加载gif。我尝试了几种方法,但都没有奏效。我要么收到错误消息,要么图像就不会出现。 版本 1(结果:图像未显示): 版本2(结果:“无效调用”) 版本3(结果:无法加载图像): 有什么想法吗?

  • 我改变了默认的应用图标,它在应用抽屉里看起来很好,但是在Android8.0最近的应用中,这个图标仍然是默认的。 同时,当我尝试卸载应用程序时,打开的警报窗口包含dafault react-native图标。 我试着看了其他帖子,发现了这个评论,但我已经设置了这些,甚至创建了一个mipmap-ldpi(36x36)图标,但它仍然保持不变。

  • 我正在尝试将我的应用程序上载到华为AppGallery Connect,该应用程序发布为Multi-APK以减小其大小(不使用应用程序包以避免被商店签名) 这是我最后的多个apk文件: 我找到了华为AppGallery解释Multi-APK的官方视频,但我找不到上传多个APK的任何选项,因为上传表单只接受1个APK,如下图所示: 你能解释一下这是否可能,以及如何做吗?

  • 我在我的Android应用程序中使用滑翔进行图像加载,以避免任何崩溃,我正在加载带有应用程序上下文的图像。这会对应用程序和内存的性能产生什么影响?

  • 我正在尝试用quarkus和graalvm构建一个java应用程序。我目前正在使用graalvm版本graalvm-ce-java11-windows-amd64-21.2.0,并更新了JAVA_HOME、graalvm_HOME和系统路径。对于MSVC,我已经下载了visual studio,并在安装过程中选择了MSVC选项。但是,当我使用mvn clean package-Pnative构建应

  • 问题内容: 我有一个UIImageView,它允许用户放置并保存图像,直到可以保存为止。问题是,我不知道如何实际保存和检索放置在视图中的图像。 我已经将图像检索并放置在UIImageView中,如下所示: 它在我的UIImageView中显示选定的图像就很好了,但是我不知道如何保存它。我将视图的所有其他部分(主要是UITextfield)保存在Core Data中。我已经搜索了很多,然后尝试了很多