将从ReactNative / Expo ImagePicker中选取的图像保存到Baqend

时间:2017-10-20 18:22:18

标签: baqend

我很难保存从Expo(React Native)中挑选的图像。

https://docs.expo.io/versions/latest/sdk/imagepicker.html

似乎React Native不支持将所选图像上传为blob,但确实有base64选项。

代码:

_pickImage = async () => {
    let pickerResult = await ImagePicker.launchImageLibraryAsync({
        allowsEditing: true,
        base64: true,
        aspect: [4, 4],
    });
    this._handleImagePicked(pickerResult);
};


_handleImagePicked(pickerResult) {
    const uri = pickerResult.base64;
    const img = new db.File({ name: 'test.jpg', data: uri, type: 'base64', mimeType: 'image/jpg' });

    db.UserData.load(this.state.UserDataID).then(UserData => {
        img.upload({ force: true }).then((file) => {
            UserData.photo = "https://remarkable-apple-95.app.baqend.com/v1" + file.id;
            alert(file.id)
            return UserData.update();
        },
            (error) => { alert(error); }
        );
    });
}

当我console.log(pickerResult.base64)时,我得到一个看起来像base64的超长字符串,但是当它运行时,img.upload会抛出错误并显示"PersistentError: An unexpected persistent error occurred."

1 个答案:

答案 0 :(得分:1)

你是对的。 React Native不支持二进制数据。不幸的是,Baqend还不支持base64文件上传。

作为一种解决方法,您有两种选择:

  1. 使用React Native Fetch Blob库,通过直接通过本机代码上传和下载文件来绕过React Native不支持二进制文件的限制,并返回对这些文件的引用。您的代码可能与此类似:

    ImagePicker.showImagePicker(options, async (response) => {
        const upload = new db.message.UploadFile('files', 'uploadFetchBlob.jpg')
        const body = 'RNFetchBlob-' + response.uri;
        RNFetchBlob.fetch('PUT', 'https://{YOUR-APP-NAME}.app.baqend.com/v1' + upload.request.path, upload.request.headers, body).then((res) => {
            db.File({ parent: 'files', name: 'uploadFetchBlob.jpg'}).url
        })
    });
    
  2. 不幸的是,现在不能使用expo客户端,但您必须弹出项目并使用本机代码'。

    1. 第二个选项是不直接使用baqend文件端点,而是将base64字符串上传到baqend模块。在那里,您可以解析base64字符串并将其从后端模块中上传到您的文件中。您可以在我们的指南中找到相关示例。 https://www.baqend.com/guide/topics/baqend-code/#handling-binary-data
    2. 希望这有帮助