You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

expo-av录制文件在手机中的存储位置及访问上传方案咨询

Expo-AV录制文件获取与上传解决方案

Expo-AV录制的音频文件默认存储在应用专属沙盒目录里,系统文件管理器无法直接访问——这是iOS和Android的沙盒隔离机制导致的。要实现上传服务器/数据库的目标,不用纠结让文件管理器可见,直接通过代码处理文件即可,步骤如下:

1. 录制完成后获取文件URI

录制结束后,从Audio.Recording实例中拿到文件的URI,这是后续操作的基础:

import { Audio } from 'expo-av';

// 初始化录制示例
const recording = new Audio.Recording();
await recording.prepareToRecordAsync(Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY);
await recording.startAsync();

// 录制结束后获取URI
await recording.stopAndUnloadAsync();
const recordedUri = recording.getURI();

2. 直接上传文件到服务器

不需要把文件复制到公共目录,直接用Expo的API或原生Fetch就能上传:

方法一:用expo-file-system上传(推荐)

import * as FileSystem from 'expo-file-system';

const uploadResponse = await FileSystem.uploadAsync(
  'https://你的服务器上传接口地址',
  recordedUri,
  {
    httpMethod: 'POST',
    uploadType: FileSystem.FileSystemUploadType.MULTIPART,
    fieldName: 'audioFile', // 要和后端接收的字段名一致
    mimeType: 'audio/m4a', // 根据录制的音频格式调整,比如mp3
  }
);

// 处理上传结果
if (uploadResponse.status === 200) {
  const result = JSON.parse(uploadResponse.body);
  // 可以把服务器返回的文件ID等信息存入数据库
}

方法二:用Fetch上传

const formData = new FormData();
formData.append('audioFile', {
  uri: recordedUri,
  name: `recording-${Date.now()}.m4a`, // 自定义文件名
  type: 'audio/m4a'
});

const fetchResponse = await fetch('https://你的服务器上传接口地址', {
  method: 'POST',
  body: formData,
  headers: {
    'Content-Type': 'multipart/form-data',
  },
});

const result = await fetchResponse.json();
// 后续逻辑:保存到数据库等

3. 可选:复制到公共目录方便调试

如果需要在文件管理器中查看录制的文件,可以用expo-file-system把文件复制到系统文档目录:

const destUri = `${FileSystem.documentDirectory}recordings/recording-${Date.now()}.m4a`;
// 确保目标目录存在
await FileSystem.makeDirectoryAsync(`${FileSystem.documentDirectory}recordings`, { intermediates: true });
// 复制文件
await FileSystem.copyAsync({
  from: recordedUri,
  to: destUri
});
  • iOS需要在app.json中添加NSDocumentFolderUsageDescription权限说明
  • Android需要配置READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限(Expo会自动处理部分权限申请)

注意事项

  • 录制时尽量指定明确的音频格式,比如用Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY确保文件类型可识别
  • 上传时的mimeType要和实际录制的文件格式匹配,避免后端解析失败
  • 可以用FileSystem.getInfoAsync(recordedUri)验证文件是否存在及大小,排查录制或上传问题

内容的提问来源于stack exchange,提问作者apanay22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:15:28