You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Chrome扩展:如何通过chrome.downloads API预定义录屏文件的下载路径与文件名

如何在Chrome扩展中预定义录屏视频的下载路径和文件名

这个需求我之前也碰到过,Chrome的安全机制确实对本地文件访问有严格限制,但还是有两种可行的方案,取决于你是只想指定文件名,还是需要自定义具体的存储路径:

方案1:仅预定义文件名(使用默认下载路径)

如果只是想固定文件名,不需要改变默认下载目录,直接用chrome.downloads.download()就能实现,关键是设置saveAs: false来跳过用户选择弹窗。

步骤:

  1. 在manifest.json中声明权限
    确保你的扩展已经申请了downloads权限:

    {
      "permissions": ["downloads"]
    }
    
  2. 录屏完成后处理Blob并触发下载
    假设你用MediaRecorder完成录屏,得到了视频Blob,先把它转成可下载的URL,然后调用API:

    // 录屏结束后获取视频Blob(recorderChunks是MediaRecorder收集的片段)
    const videoBlob = new Blob(recorderChunks, { type: 'video/webm' });
    const videoUrl = URL.createObjectURL(videoBlob);
    
    // 调用downloads API,指定文件名并跳过保存弹窗
    chrome.downloads.download({
      url: videoUrl,
      filename: '我的录屏视频.webm', // 这里设置你想要的固定文件名
      saveAs: false // 关键参数:跳过用户选择保存位置的弹窗
    }, (downloadId) => {
      if (chrome.runtime.lastError) {
        console.error('下载失败:', chrome.runtime.lastError);
      } else {
        console.log('下载已触发,ID:', downloadId);
        // 记得释放URL对象,避免内存泄漏
        URL.revokeObjectURL(videoUrl);
      }
    });
    

    这样视频会直接保存到用户Chrome设置里的默认下载文件夹,文件名就是你指定的内容,不会弹出选择窗口。

方案2:自定义存储路径(需要用户授权)

如果必须要指定自定义的本地路径,Chrome不允许扩展直接硬编码路径(安全限制),但可以通过File System Access API让用户一次性授权一个目录,之后扩展就能在这个目录下自由创建/写入文件,不需要每次都弹窗。

步骤:

  1. 在manifest.json中声明相关权限
    需要申请fileSystem.write权限(Chrome 86+支持):

    {
      "permissions": ["fileSystem.write"]
    }
    
  2. 请求用户授权目标目录并持久化存储
    第一次使用时,让用户选择要保存录屏的目录,然后把目录句柄存在chrome.storage.local里,下次就不用再选了:

    async function getTargetDirectory() {
      // 先尝试从存储中读取已授权的目录句柄
      const storedHandle = await chrome.storage.local.get('recordingDir');
      if (storedHandle.recordingDir) {
        // 验证句柄是否还可用(比如用户可能删除了目录)
        try {
          await storedHandle.recordingDir.queryPermission({ mode: 'readwrite' });
          return storedHandle.recordingDir;
        } catch (e) {
          // 权限失效,重新请求
        }
      }
    
      // 请求用户选择目录
      const handle = await window.showDirectoryPicker({
        mode: 'readwrite',
        suggestedName: '录屏存储目录'
      });
    
      // 保存句柄到本地存储,下次复用
      await chrome.storage.local.set({ recordingDir: handle });
      return handle;
    }
    
  3. 将录屏Blob写入指定目录的文件
    录屏完成后,获取目录句柄,然后创建/写入文件:

    async function saveRecordingToCustomDir(videoBlob) {
      try {
        const dirHandle = await getTargetDirectory();
        // 创建或覆盖指定文件名的文件
        const fileHandle = await dirHandle.getFileHandle('我的录屏视频.webm', { create: true });
        // 创建可写流并写入Blob
        const writable = await fileHandle.createWritable();
        await writable.write(videoBlob);
        await writable.close();
        console.log('录屏已保存到自定义目录');
      } catch (e) {
        console.error('保存失败:', e);
      }
    }
    
    // 录屏结束后调用
    saveRecordingToCustomDir(videoBlob);
    

注意事项:

  • 方案2的目录句柄存储是持久化的,但如果用户清除了扩展数据,或者在系统中删除了该目录,权限会失效,需要重新请求。
  • File System Access API目前只支持Chrome 86及以上版本,如果你需要兼容旧版Chrome,建议优先用方案1。
  • 不管用哪种方案,都要记得处理录屏Blob的内存释放(比如URL.revokeObjectURL),避免内存泄漏。

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

火山引擎 最新活动