【问题标题】:React Native : convert local image to urlReact Native:将本地图像转换为 url
【发布时间】:2022-01-22 08:56:42
【问题描述】:

我对使用 React Native(在本例中为 Expo)和 Firebase 数据库非常陌生。

我的问题是,当我通过 Image Picker 在我的应用中上传图片时,链接是本地链接,所以只能用我的设备读取,然后在我清除缓存时删除

这是我的代码:

useEffect(() => {
    (async () => {
        if (Platform.OS !== "web") {
            const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();
            if (status !== "granted") {
                alert("Sorry, we need camera roll permissions to make this work!");
            }
        }
    })();
}, []);

const pickImage = async () => {
    let result = await ImagePicker.launchImageLibraryAsync({
        mediaTypes: ImagePicker.MediaTypeOptions.All,
        allowsEditing: true,
        quality: 1,
    });
    
    if (!result.cancelled) {
        setImage(result.uri);
    }
};

// My current image is locate to : "file:///data/user/0/host.exp.exponent/cache/
// ExperienceData/ImagePicker/2abe4097-05ed-4d23-5648-f279d5a6f995.jpg"

// And what I want is to locate my image to : "https://someting..."

所以我想将此图像 uri 链接转换为 url 链接,以便共享且永不删除。

有人知道如何进行吗?

非常感谢!

【问题讨论】:

  • 请补充更多细节,代码sn-p和例子,还不是很清楚:)
  • @vinalti 我只是添加我的代码:)
  • 在这里回答了类似的问题:stackoverflow.com/a/70580835/3832047。您需要将文件作为 base64 上传到您的服务器,或者将其流式传输 - 流式传输更好,但需要更多代码。
  • @Phobos,我试过但对我不起作用。你有链接或其他东西可以尝试流式传输吗?我不知道该搜索什么来帮助我谢谢!
  • 您在使用 base64 选项时遇到了什么问题?我可以保证它比设置您的服务器进行文件流式传输更容易解决。

标签: react-native image url expo


【解决方案1】:

让我们将问题分解如下:

1.从媒体库中选择一张图片。

const pickImage = async () => {
   let result = await ImagePicker.launchImageLibraryAsync({
       mediaTypes: ImagePicker.MediaTypeOptions.All,
       allowsEditing: true,
       quality: 1,
   });
   
   if (!result.cancelled) {
       setImage(result.uri);
   }
};


2。获取图像 BLOB 数据


  const blob = await new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.onload = function () {
      resolve(xhr.response);
    };
    xhr.onerror = function (e) {
      reject(new TypeError("Network request failed"));
    };
    xhr.responseType = "blob";
    xhr.open("GET", [IMAGE_URI_HERE], true);
    xhr.send(null);
  });

3.将图像 BLOB 上传到远程服务器(Firebase 存储)


  const metadata = { contentType: "image/jpg" };

  const imgRef = firebase.storage().ref('folderName/fileName');

  await imgRef.put(blob, metadata);

  // We're done with the blob, close and release it
  blob.close();
 
  // Image permanent URL 
  const imgURL = await imgRef.getDownloadURL();



【讨论】:

  • 非常感谢!我正在尝试。问题是我从“@react-native-firebase/storage”导入存储出现错误:错误:您试图通过调用 firebase.app() 来使用未安装在您的 Android 项目上的 firebase 模块。我不明白这是什么意思
  • 您需要安装 Firebase 存储 - firebase.google.com/docs/storage/web/start
  • 感谢您的帮助!我还在上面,但 img.put() 不起作用。 “这不是函数”,我不明白为什么
  • Firebase 设置似乎有问题。您可以通过 emmbyiringiro@gmail.com 与我联系,我可以深入了解您的实施情况
猜你喜欢
  • 2019-07-12
  • 2020-06-01
  • 2016-04-26
  • 2022-10-17
  • 2018-06-14
  • 2019-04-30
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多