React Native上传音频至NestJS仅传元数据,文件内容为空Buffer
React Native 录制音频上传至 NestJS 服务端时文件内容为空(Buffer 大小为0)
我使用 React Native 客户端和 NestJS 服务端开发录制音频并上传的功能,该 API 端点在 Postman 和 React 网页端测试均正常,但通过 React Native 上传文件时,服务端仅能收到文件元数据,文件内容为 size 为 0 的空 Buffer。在 stopRecording 处理函数中,已确认发送请求前 formData 确实包含音频文件内容。
React Native 组件代码
const AudioInput3 = () => { const [recording, setRecording] = useState<Recording | null>(null); const [recordingStatus, setRecordingStatus] = useState("idle"); const [audioPermission, setAudioPermission] = useState(false); const startRecording = async () => { try { if (audioPermission) { await Audio.setAudioModeAsync({ allowsRecordingIOS: true, playsInSilentModeIOS: true, }); } const newRecording = new Audio.Recording(); await newRecording.prepareToRecordAsync( Audio.RecordingOptionsPresets.HIGH ); await newRecording.startAsync(); setRecording(newRecording); setRecordingStatus("recording"); } catch (err) { console.error("Failed to start recording", err); } }; async function stopRecording() { try { if (!recording) return; if (recordingStatus === "recording") { await recording.stopAndUnloadAsync(); const recordingUri = recording.getURI() as string; const filename = `recording_${Date.now()}.caf`; const filePath = FileSystem.documentDirectory + "recordings/"; setRecording(null); setRecordingStatus("stopped"); const fileData = await FileSystem.readAsStringAsync(recordingUri, { encoding: FileSystem.EncodingType.Base64, }); const blob = new Blob([fileData], { type: "audio/x-caf" }); const file = new File([blob], filename, { type: "audio/x-caf", }); const fileSize = file.size; const formData = new FormData(); formData.append("file", file); const response = await fetch(urlResolver.uploadToStorage(), { method: "POST", body: formData, headers: { "Content-Type": "multipart/form-data", "Content-Length": String(fileSize), }, }); } } catch (error) { console.error(error); } } }
已尝试的解决方案
- 移除请求头,无效;
- 用 axios 替换 fetch,无效;
- 关闭 react-native-debugger,无效。
NestJS API 端点代码
@Post("upload") @UseInterceptors(FileInterceptor("file")) uploadFile(@UploadedFile() file: Express.Multer.File) { console.log(file); }
服务端返回结果(空 Buffer)
{ fieldname: 'file', originalname: 'recording_1683615927273.caf', encoding: '7bit', mimetype: 'audio/x-caf', buffer: <Buffer >, size: 0 }
内容的提问来源于stack exchange,提问作者Kittichote Chain
相关产品推荐
相关产品推荐

