Cordova Android大文件下载受限,如何突破50MB限制?
在Cordova Android应用中突破50MB文件下载限制的解决方案
问题描述
我正尝试在Cordova Android应用内下载一个ZIP文件,但当文件大小超过50MB时下载失败,请问如何提升这个50MB的限制?我的代码如下:
var var_url = 'https://example.com/teste.zip'; // 待下载文件的地址 var fileURL = "///storage/emulated/0/Android/data/myapp/teste.zip"; // 保存路径 var req = new XMLHttpRequest(); req.open("GET", var_url, true); req.responseType = "blob"; req.onload = function (event) { var blob = req.response; alert(blob.size); alert(blob.type); alert("WORKS!"); alert(fileURL); alert(var_url); if (blob.size>52747758) { alert('This file is over 50 megabytes') } //52747758约等于50.30MB // cordova.file.etc是文件保存位置,这里是Android主存储的应用文件夹内 window.resolveLocalFileSystemURL(cordova.file.externalApplicationStorageDirectory, function (directoryEntry) { // 'temp.pdf'是你想要的文件名,这里改为teste.zip directoryEntry.getFile('teste.zip', { create: true }, function (fileEntry) { fileEntry.createWriter(function (fileWriter) { fileWriter.onwriteend = function (e) { // 下载成功 alert('Write of file completed.'); }; fileWriter.onerror = function (e) { // 写入失败 alert('Write failed'); }; fileWriter.write(blob); } ); } ); }); }; req.send();
解决方案
你当前的代码用XMLHttpRequest+Blob处理大文件时,会把整个文件加载到内存中,当文件超过50MB时容易触发内存溢出(OOM),导致下载失败。推荐使用Cordova官方的FileTransfer插件,它采用流式下载(边下载边写入本地文件),不会占用大量内存,也没有默认的50MB限制。
步骤1:安装FileTransfer插件
执行以下命令安装插件:
cordova plugin add cordova-plugin-file-transfer
步骤2:替换为FileTransfer下载代码
把原来的XMLHttpRequest代码替换为以下代码:
var var_url = 'https://example.com/teste.zip'; var savePath = cordova.file.externalApplicationStorageDirectory + 'teste.zip'; var fileTransfer = new FileTransfer(); fileTransfer.download( var_url, savePath, function(fileEntry) { alert('下载完成,文件路径:' + fileEntry.toURL()); }, function(error) { alert('下载失败:' + error.code + ',错误信息:' + error.source + ' -> ' + error.target); }, false, // 是否信任所有SSL证书,生产环境建议设为false {} // 可选的请求头,比如Authorization等 );
额外注意事项
- 针对Android 10及以下版本,确保
AndroidManifest.xml中已添加存储权限:
Android 11及以上采用分区存储,无需额外申请该权限,直接使用<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />cordova.file.externalApplicationStorageDirectory即可。 - 检查设备存储是否有足够剩余空间,避免因空间不足导致下载失败。
内容的提问来源于stack exchange,提问作者Dani Carla
相关产品推荐
相关产品推荐

