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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:55:29