Как перенести записанный аудиофайл из приложения Expo на сервер NodeJS - PullRequest
0 голосов
/ 20 марта 2019

Я разрабатываю мобильное приложение в Expo и пытаюсь передать записанные аудиофайлы на сервер NodeJS с помощью fetch (). После нескольких попыток я не смог отправить файлы.

Я могу успешно разместить простой текст в теле запроса на выборку, однако, когда я добавляю блоб или uri в formData, экспресс-сервер правильно считывает информацию (имя и тип файла), но показывает нулевой размер файла , Я протестировал его, используя multer и formidable, и когда файлы все еще не перешли, я проверил конфигурацию сервера с помощью почтальона и успешно смог POST-файлы использовать поле формы данных.

Я смог проверить, существует ли файл в 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

Кроме того, я не уверен, что это вызовет проблемы, но я надеюсь, что не вытолкну из Expo CLI, так как я занимаюсь разработкой на ПК и у меня нет легкого доступа к mac для использования x-кода.

Заранее спасибо!

...