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

在Expo React Native中使用react-native-fs上传大文件时遇内存错误求助

解决RNFS分片读取大文件的内存问题

问题根源

你用的RNFS.readFile(fileUri, length, offset, 'base64')虽带offset和length参数,但RNFS的这个方法底层会先把整个文件加载到内存再截取分片,大文件直接占满内存,完全达不到分片读取的目的。

正确的分片读取方案

改用RNFS的read方法(注意不是readFile),这个方法是真正的逐块读取,每次仅把指定offset和length的内容加载到内存中。

实现步骤

  1. 获取文件总大小,计算分片数量与每个分片的偏移量
  2. 循环调用RNFS.read读取单个分片,处理完成后再读取下一个,避免同时加载多个分片到内存

代码示例

import RNFS from 'react-native-fs';

const CHUNK_SIZE = 1024 * 1024; // 1MB分片大小,可按需调整

async function uploadLargeFile(fileUri) {
  // 获取文件总大小
  const fileStats = await RNFS.stat(fileUri);
  const totalSize = fileStats.size;
  let offset = 0;

  while (offset < totalSize) {
    // 计算当前分片的实际长度(最后一块可能小于CHUNK_SIZE)
    const chunkLength = Math.min(CHUNK_SIZE, totalSize - offset);
    
    // 真正分片读取,仅当前块进入内存
    const chunkBase64 = await RNFS.read(fileUri, chunkLength, offset, 'base64');
    
    // 处理当前分片:替换为你的实际上传逻辑
    await uploadChunk(chunkBase64, offset, totalSize);
    
    // 更新偏移量,读取下一块
    offset += chunkLength;
  }
}

// 模拟分片上传函数
async function uploadChunk(chunk, offset, totalSize) {
  console.log(`上传分片:偏移量${offset},分片大小${chunk.length}`);
  // 这里写你的服务器上传代码
}

关键注意点

  • 不要同时发起多个分片的读取/上传请求,确保处理完一个再处理下一个,避免内存累积
  • 分片大小可根据设备内存和网络情况调整,比如2MB或5MB
  • 若需并发上传,可控制并发数(比如同时传2-3个分片),但要留意内存占用情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:12:37