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

将我的图片上传从1张扩展到5张;地图/foreach?

孟翰海
2023-03-14

我正在创建一个应用程序,您可以在其中将照片和其他一些数据上传到Firebase。上传部分在一张图片上运行得非常完美。但是,我现在添加了一个多图像图片(选择1到5张图片),并希望我的图像上载功能上载5张图片,而不是1张图片。图像上载与提供的1个图像一起工作,因此如何重新排列代码以上载阵列中x数量的照片?

图片与以下数据一起添加到照片数组中(下面显示的输出是从获取的图像中获取的console.log);

Array [
  Object {
    "exists": true,
    "file": "ph://8905951D-1D94-483A-8864-BBFDC4FAD202/L0/001",
    "isDirectory": false,
    "md5": "f9ebcab5aa0706847235887c1a7e4740",
    "modificationTime": 1574493667.505371,
    "size": 104533,
    "uri": "ph://8905951D-1D94-483A-8864-BBFDC4FAD202/L0/001",
  },

有了这个didFocus,我检查是否设置了fethedImages参数,并将照片数组设置为获取的图像(所以上面显示的所有数据)

 const didFocusSubscription = props.navigation.addListener(
        'didFocus', () => {
            let fetchedImages = props.navigation.getParam('fetchedImages')
            console.log(fetchedImages)
            setPhotos(fetchedImages)
            setImageValid(true)
            calculateImageDimensions()
        }
    );

当我保存页面并开始分派数据时,我运行以下命令,运行上传图像功能,并返回上传URL,然后将其保存在分派功能中,稍后将获取Firebase数据库;

 uploadurl = await uploadImageAsync(photos)

因此uploadImageAsync从转发的照片数组开始。如何确保为每张照片启动以下功能。数组中的uri?我可以用吗。对于这一点,我应该在什么环境下使用它?此外,我也不太确定如何将URL数组发回并与其余信息一起保存。

  async function uploadImageAsync(photos) {
        console.log('uploadImage is gestart')
        // Why are we using XMLHttpRequest? See:
        // https://github.com/expo/expo/issues/2402#issuecomment-443726662
        const blob = await new Promise((resolve, reject) => {
            const xhr = new XMLHttpRequest();
            xhr.onload = function () {
                resolve(xhr.response);
            };
            xhr.onerror = function (e) {
                console.log(e);
                reject(new TypeError('Network request failed'));
            };
            xhr.responseType = 'blob';
            xhr.open('GET', photos, true);
            xhr.send(null);
        });

        const ref = firebase
            .storage()
            .ref()
            .child(uuid.v4());
        const snapshot = await ref.put(blob);

        // We're done with the blob, close and release it
        blob.close();

        return await snapshot.ref.getDownloadURL();

    }

==============编辑,因为上传====================的进展

我再一次走得更远了一点。然而,图像上传功能现在正在运行,由于是多个图像,我希望在继续之前等待所有图像的响应。

    try {
        uploadurl = await uploadImageAsync()
        address = await getAddress(selectedLocation)
        console.log(uploadurl)
        if (!uploadurl.lenght) {
            Alert.alert('Upload error', 'Something went wrong uploading the photo, plase try again', [
                { text: 'Okay' }
            ]);
            return;
        }

        dispatch(

这时,我开始上传ImageAsync函数。在他的帮助下console.log我看到它上传图像,它们也出现在网上。但是当上传图片时,上传网址已经返回0,并显示警报并停止该功能。

uploadImageAsync = async () => {
    const provider = firebase.database().ref(`providers/${uid}`);
    let imagesArray = [];
    try {
        await photos.map(img => {
            let file = img.data;
            const path = "Img_" + uuid.v4();
            const ref = firebase
                .storage()
                .ref(`/${uid}/${path}`);
            ref.putString(file).then(() => {
                ref
                    .getDownloadURL()
                    .then(images => {
                        imagesArray.push({
                            uri: images
                        });
                        console.log("Out-imgArray", imagesArray);
                    })
        return imagesArray   <== this return imagesArray is fired to early and starts the rest of my upload function. 
    } catch (e) {
        console.error(e);
    }
};

共有1个答案

柯昆
2023-03-14

因此,一次不和谐的谈话给我指明了promise的方向。所有这些功能都可以让它工作。我试过了,但是打开了另一个堆栈溢出主题来让它工作。

在继续功能之前,等待图像上传的响应

我的图片上传功能的解决方案在上面的主题中;

uploadImages = () => {
    const provider = firebase.database().ref(`providers/${uid}`);
    // CHANGED: removed 'let imagesArray = [];', no longer needed

    return Promise.all(photos) // CHANGED: return the promise chain
        .then(photoarray => {
            console.log('all responses are resolved successfully');
            // take each photo, upload it and then return it's download URL
            return Promise.all(photoarray.map((photo) => { // CHANGED: used Promise.all(someArray.map(...)) idiom
              let file = photo.data;
              const path = "Img_" + uuid.v4();
              const storageRef = firebase // CHANGED: renamed 'ref' to 'storageRef'
                    .storage()
                    .ref(`/${uid}/${path}`);
              let metadata = {
                  contentType: 'image/jpeg',
              };

              // upload current photo and get it's download URL
              return storageRef.putString(file, 'base64', metadata) // CHANGED: return the promise chain
                .then(() => {
                  console.log(`${path} was uploaded successfully.`);
                  return storageRef.getDownloadURL() // CHANGED: return the promise chain
                    .then(fileUrl => ({uri: fileUrl}));
                });
            }));
        })
        .then((imagesArray) => {                       // These lines can
          console.log("Out-imgArray: ", imagesArray)   // safely be removed.
          return imagesArray;                          // They are just
        })                                             // for logging.
        .catch((err) => {
          console.error(err);
        });
};
 类似资料:
  • 问题内容: 我也曾在SO和其他教程中发表过很多文章,但是我没有得到任何最新的官方或其他文章,这些文章不包含使用Volley上传多个图像的弃用代码。我知道Apache HTTP Client删除并在新的android M中相关,因此建议改用下面的方法。 那么,有谁能帮我完成新的不推荐使用的少排球类上载多张图片的工作? 问题答案: 您可以从此处使用volley的最新版本。这是一个非官方的镜像,带有一些

  • 问题内容: 我是在项目中使用代码点火器的新用户,上载多个文件时遇到一个问题,但最后一个仅插入到所有图像“三个图像”字段中。 我的控制器是: 我的观点是: 请帮助如何插入3张图像。 我的资料库 问题答案: HTML: PHP的:

  • 我在SO和其他tuts中看了很多帖子,但我无法得到任何最新的官方或其他帖子,其中不包含任何关于使用排球上传多个图片的不推荐代码。我了解了Apache HTTP客户端删除和新android M中的相关内容,所以更喜欢使用下面的内容。

  • 问题内容: 我正在使用以下代码将单个图像上传到服务器: 如何通过编辑此代码在单个参数中上传多张图片? 问题答案: Swift 3 只需在图像上传参数中使用“ []”即可使其成为图像数组。

  • 本文向大家介绍Angular下H5上传图片的方法(可多张上传),包括了Angular下H5上传图片的方法(可多张上传)的使用技巧和注意事项,需要的朋友参考一下 最近做的项目中用到了angular下上传图片功能,在做的过程中遇到了许多问题,最终都得以解决 angular上传时和普通上传时过程差不多,只不过是要不一些东西转化为angular的东西。 1.ng-file-select,指令angular

  • 问题内容: 我在Swift iOS项目中使用Google Firebase。我的应用程序有一部分,用户从设备中选择多张照片进行上传。我正在尝试找到最佳实践,以将他们一次选择的所有照片上传到Firebase Storage。我知道如何上传一张照片。 我浏览了文档,没有看到有关上载多个NSData对象的任何方法,所以我只需要运行for循环并分别上载每个图像? 谢谢!感谢所有反馈。 问题答案: @Fra

  • 问题内容: 我想使用node.js合并2张图片。或者更确切地说,我想将一个较小的图像放置在较大图像上的坐标x,y上。甚至更精确:我有一个眼镜的图像和一张脸的图像,并且我想将眼镜放在脸上。我做了一些谷歌搜索,发现了一些图像处理库,但似乎没有一个能够合并图像。 问题答案: 我用过: https://github.com/learnboost/node- canvas 做类似的事情(动态地从组件构建合成

  • 本节将帮助您一步一步创建一张地图。该地图的最终效果如下。 分享链接:http://d.dituzhe.com/ShareMap/0EB1C2 1 地图分析 该地图包含两个图层,一个是点图层,指我们的店铺信息。一个是面图层,指我们的销售区域。下面将介绍如何创建这些数据,以及如何将这些数据添加到地图中,并设置数据的显示样式。 2 创建店铺数据 点击首页的“数据管理”页面,进入后点击“新增数据”按钮 在