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

React Native Android获取文件真实路径遇异常:部分文件返回空+上传报错

React Native 文件选择与上传问题解决

场景复现

使用react-native-document-picker选择文件,react-native-fs实现上传,相关代码如下:

选择文件的代码:

try {
  const res = await DocumentPicker.pick({
    type: [DocumentPicker.types.allFiles],
    copyToCacheDirectory: false
  });
} catch (err) {
  // 错误处理
}

获取到的文件URI示例:content://com.android.providers.media.documents/document/image%3A24

随后使用react-native-get-real-path转换真实路径:

RNGRP.getRealPathFromURI(res[0].uri)
  .then(filePath => {
    realFilePath = filePath
    console.log("real-path-->" + filePath)
    ToastAndroid.show(filePath, ToastAndroid.SHORT);
  })

遇到的问题

  1. 路径转换仅对部分文件有效,部分文件返回null;
  2. 上传文件时出现错误:[错误:套接字已关闭](原错误信息:[Error: Socket is closed])

解决方案

问题1:路径转换返回null

react-native-get-real-path对Android 10及以上的Scoped Storage支持不佳,很多受权限保护的文件(比如非媒体库文件、私有目录文件)无法转换出真实路径,建议直接放弃这个库,改用以下两种方式:

  • 方式一:让DocumentPicker直接返回可访问路径
    修改copyToCacheDirectory为true,react-native-document-picker会将选中的文件复制到应用缓存目录,返回的uri就是可直接使用的本地文件路径(格式类似file:///data/user/0/xxx/cache/xxx),无需再转换路径:
try {
  const res = await DocumentPicker.pick({
    type: [DocumentPicker.types.allFiles],
    copyToCacheDirectory: true
  });
  // 此时res[0].uri可直接用于react-native-fs的上传操作
} catch (err) {
  // 错误处理
}
  • 方式二:直接通过Content URI操作文件
    react-native-fs支持直接通过Content URI读取文件内容,无需转换真实路径,比如读取文件为base64后再上传:
const fileContent = await RNFS.readFile(res[0].uri, 'base64');
// 将fileContent作为请求体的一部分上传

问题2:上传时提示“套接字已关闭”

这个错误通常是上传过程中连接中断导致,可从以下几点排查解决:

  • 确认文件路径有效:确保上传用的文件路径不是null或无效路径,优先用上面方式一获取的路径;
  • 检查网络状态:上传时网络不稳定会导致连接中断,确保设备网络正常;
  • 调整上传配置:给react-native-fs的上传请求设置合理的超时时间,避免因超时导致连接关闭:
RNFS.uploadFiles({
  toUrl: '你的上传接口地址',
  files: [{
    name: 'file',
    filename: res[0].name,
    filepath: res[0].uri,
    filetype: res[0].type
  }],
  method: 'POST',
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  timeout: 30000 // 设置30秒超时
}).promise.then(response => {
  // 处理上传成功逻辑
}).catch(err => {
  // 处理上传错误
});
  • 排查服务器端:确认服务器是否设置了过短的超时时间,或者是否存在连接限制,确保服务器配置正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:22