在Expo React Native中使用react-native-fs上传大文件时遇内存错误求助
解决RNFS分片读取大文件的内存问题
问题根源
你用的RNFS.readFile(fileUri, length, offset, 'base64')虽带offset和length参数,但RNFS的这个方法底层会先把整个文件加载到内存再截取分片,大文件直接占满内存,完全达不到分片读取的目的。
正确的分片读取方案
改用RNFS的read方法(注意不是readFile),这个方法是真正的逐块读取,每次仅把指定offset和length的内容加载到内存中。
实现步骤
- 获取文件总大小,计算分片数量与每个分片的偏移量
- 循环调用
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
相关产品推荐
相关产品推荐

