我正在使用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 });
});
上传失败,并出现以下错误。serverResponse:
{
"error": {
"code": 400,
"message": "Bad Request. Could not create object",
"status": "CREATE_OBJECT"
}
}
答案 0 :(得分:0)
就您而言,我认为您也可以通过获取带有文件路径的文件来创建Blob。
let res = await fetch(filePath);
let blob = await res.blob
在我看来,这始终有效。