如何将录制的音频文件从Expo应用传输到NodeJS服务器

时间:2019-03-20 16:30:40

标签: node.js audio blob expo form-data

我正在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。 >

谢谢!

0 个答案:

没有答案