Cordova File插件不支持FileWriter.write(blob),如何实现文件下载?
Cordova 文件下载及 FileWriter.write(Blob) 问题解决
问题原因
Cordova File 插件的 FileWriter.write(Blob) 方法在部分平台(如 Android/iOS 特定版本)存在兼容性问题,无法正常写入 Blob 数据。
解决方案 1:将 Blob 转换为 ArrayBuffer 写入
由于 FileWriter 对 ArrayBuffer 支持更稳定,可先把 Blob 转换为 ArrayBuffer 再执行写入:
1. Blob 转 ArrayBuffer 工具函数
async function blobToArrayBuffer(blob) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = reject; reader.readAsArrayBuffer(blob); }); }
2. 修改写入方法
async function writeFile(fileEntry, blob, fileName) { try { const arrayBuffer = await blobToArrayBuffer(blob); fileEntry.createWriter(fileWriter => { fileWriter.onwrite = this.onWriteEnd; fileWriter.onerror = this.onWriteError; fileWriter.write(arrayBuffer); // 替换为 ArrayBuffer }); } catch (err) { console.error('Blob 转换失败:', err); } }
解决方案 2:直接从 URL 下载文件到本地
如果你的需求是从网络下载文件,推荐结合 XMLHttpRequest 获取文件的 ArrayBuffer,再写入本地,流程更稳定:
function downloadFile(url, saveFileName) { const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'arraybuffer'; xhr.onload = function() { if (xhr.status === 200) { // 选择存储目录,这里以外部数据目录为例 window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, (dirEntry) => { dirEntry.getFile(saveFileName, { create: true, exclusive: false }, (fileEntry) => { // 调用上面修改后的 writeFile 方法 writeFile(fileEntry, new Blob([xhr.response]), saveFileName); }, err => console.error('创建/获取文件失败:', err)); }, err => console.error('访问目录失败:', err)); } }; xhr.onerror = err => console.error('下载请求失败:', err); xhr.send(); }
必要权限配置
Android(config.xml)
<platform name="android"> <config-file parent="/manifest" target="AndroidManifest.xml"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </config-file> </platform>
iOS(config.xml)
<platform name="ios"> <config-file parent="NSPhotoLibraryAddUsageDescription" target="*-Info.plist"> <string>需要访问相册以保存文件</string> </config-file> <config-file parent="NSPhotoLibraryUsageDescription" target="*-Info.plist"> <string>需要访问相册以保存文件</string> </config-file> </platform>
内容的提问来源于stack exchange,提问作者Evan Jang
相关产品推荐
相关产品推荐

