我正在Expo中开发一个移动应用程序,并尝试使用fetch()将录制的音频文件传输到NodeJS服务器。在尝试了几种不同的方法后,我无法发送文件。
我能够在fetch请求主体中成功发布简单文本,但是,当我将一个blob或uri添加到formData时,快递服务器会正确读取信息(文件名和类型),但文件大小为零。我已经使用multer和permable进行了测试,当文件仍然无法传输时,我使用postman测试了服务器配置,并且能够使用其中的form-data字段成功发布文件。
完成录制后,我可以通过使用以下代码检查文件信息来验证文件是否存在于Expo中:
const info = await FileSystem.getInfoAsync(recording.getURI());
console.log(`FILE INFO: ${JSON.stringify(info)}`);
打印到控制台的此信息成功返回,如下所示:
FILE INFO: {"size":548864,"modificationTime":1553094025.727294,"uri":"file:///var/mobile/Containers/Data/Application/8488FB96-5F96-4690-84CC-C52B4E2136C8/Library/Caches/ExponentExperienceData/%2540christophera%252Fencounters-app/AV/recording-5C8E7D16-BA89-4DD7-B249-D0865D191BDD.caf","isDirectory":false,"exists":true}
在此之后,我可以使用URI创建BLOB:
const response = await fetch(fileURI);
const blob = await response.blob();
打印到控制台时,它也会成功返回,尽管奇怪的是它的尺寸要小得多:
{"_data":{"blobId":"260ee7da-4e7d-401a-9243-09f1cd85149f","offset":0,"size":243976,"type":"","lastModified":1553093860777}}
这使我相信问题在于创建FormData对象,我正在这样做:
let formData = new FormData();
formData.append('soundBlob', blob, fileName);
console.log(formData);
const options = {
method: 'POST',
body: formData,
headers: {
'enctype': 'multipart/form-data',
},
};
await fetch(fileAPI_server, options)
.then(response => console.log(response.status))
.catch(error => console.log('Error:', error));
(此处显示的标题来自我最近对multer进行的测试,要求声明enctype)
如果好奇的话,我可以共享更多我的后端代码,但是正如我说的那样,因为我能够接收通过邮递员测试的声音文件,所以我相信那里的所有配置都正确。
如果您想更全面地了解博览会设置,我已经在Snack中重新创建了场景,您可以在这里进行测试:
https://snack.expo.io/@christophera/recording-upload-test
也不确定是否会带来问题,但是我希望不要因为我在PC上进行开发并且无法轻松访问Mac以使用X代码而退出Expo CLI。 >
谢谢!