繁体   English   中英

如何使用 react-native 和 expo 将 m4a 音频文件上传到 Firebase 存储?

[英]How does one upload an m4a audio file to Firebase Storage using react-native and expo?

我正在使用 react-native 和 expo 构建应用程序。 该应用程序的一项功能允许用户录制音频,然后将其上传到 Firebase 存储。 我设法成功录制了音频,还设法将缓存文件作为 blob 检索,但是当尝试将其上传到 Firebase 存储时,它失败并出现错误代码 400,“错误请求。无法创建对象”。 让我感到困惑的是,我使用相同的过程来上传完美的图片。 为什么音频文件会失败?

我成功地录制了音频,并使用 XMLHttpRequest 检索了缓存文件(作为 blob)。 当我将其记录到控制台时输出的结果 blob 如下所示:

    Blob {
        "_data": Object {
            "blobId": "lengthy blob id",
            "name": "recording-XXXXXX.m4a",
            "offset": 0,
            "size": 371097,
            "type": "audio/x-m4a",
        },
    }

当我尝试使用 ref.put(blob) 上传到 Firebase 存储时,它返回 400 错误:“错误请求。无法创建对象”。 我还尝试将 contentType 作为元数据的一部分提供,以查看这是否会有所作为,但无济于事。

这就是我获取文件的方式:

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

要将 blob 上传到 Firebase 存储,我执行以下操作:

    const clientuid = 123;
    const siteid = 'ABC';
    const audioName = `${Date.now}.m4a`;
    this.setState({ uploading: true });
    const ref = firebase.storage().ref().child(`audio/${clientuid}/${siteid}/${audioName}`);
    ref.put(blob)
    .then(async (snapshot) => {
        const fullUrl = await snapshot.ref.getDownloadURL();
        // Upload the Url to Firebase realtime database...
        Alert.alert('Upload Successful');
    .catch((error) => {
        console.log(error.serverResponse);
        Alert.alert('Failed to create object!');
    })
    .finally(() => {
        blob.close()
        this.setState({ uploading: false });
    });

上传失败并显示以下错误。服务器响应:

    {
       "error": {
          "code": 400,
          "message": "Bad Request. Could not create object",
          "status": "CREATE_OBJECT"
       }
    }

在您的情况下,我认为您还可以通过使用文件路径获取文件来创建 blob。

let res = await fetch(filePath);
let blob = await res.blob

在我的情况下,这总是有效。

有没有一种可能的方式我可以获得这个的源代码

暂无
暂无

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

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