Я разрабатываю мобильное приложение в 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-кода.
Заранее спасибо!