js 实现将后端请求来的 Blob 数据保存到用户选择的任意目录

js实现将后端请求来的 Blob 数据保存到用户选择的任意目录

实现方式

实现方式是使用 window 的 showSaveFilePicker 方法。Window 接口的 showSaveFilePicker() 方法用于显示一个文件选择器,以允许用户保存一个文件。可以选择一个已有文件覆盖保存,也可以输入名字新建一个文件。

具体示例如下:

使用 fetch 或者 axios 从后端获取 Blob 数据。

使用 showSaveFilePicker 让用户选择保存文件的位置。

将 Blob 数据写入用户选择的文件。

以下是一个完整的示例代码:

html 复制代码
<!DOCTYPE html>
<html>

<head>
  <title>js实现将后端请求来的 Blob 数据保存到用户选择的任意目录</title>
</head>

<body>
  <h2>js实现将后端请求来的 Blob 数据保存到用户选择的任意目录</h2>

  <button onclick="saveBlobFromServer()">保存文件</button>

  <script>
    async function saveBlobFromServer() {
      try {
        // 1: 从后端获取 Blob 数据,这里就直接模拟一个 Blob 数据
        const obj = { hello: "world" };
        const blob = new Blob([JSON.stringify(obj, null, 2)], {
          type: "application/json",
        });

        // 2: 显示文件保存选择器。这段代码显示文件保存对话框,允许用户选择保存文件的位置和名称。
        const opts = {
          suggestedName: 'downloaded-file',
          types: [
            {
              // 建议的文件名
              description: "文件",
              // 允许选择的文件类型的数组
              accept: {
                "text/plain": [".txt"],
                "application/pdf": [".pdf"],
                "image/jpeg": [".jpg", ".jpeg"],
                "image/png": [".png"],
              },
            },
          ],
          excludeAcceptAllOption: true,
        };

        const fileHandle = await window.showSaveFilePicker(opts);

        // 3: 创建一个可写流,并将 Blob 数据写入用户选择的文件中。
        const writableStream = await fileHandle.createWritable();
        await writableStream.write(blob);
        await writableStream.close();

        console.log('文件保存成功');
      } catch (error) {
        console.error('文件保存失败:', error);
      }
    }
  </script>
</body>

</html>
  • 注意
    showSaveFilePicker 是一个实验性 API,可能并不在所有浏览器中都可用。请确保在支持的环境中使用。
    你可能需要在 HTTPS 环境下运行此代码,因为许多现代浏览器要求文件系统 API 在安全上下文中使用。
相关推荐
!win !13 分钟前
uni-app项目怎么实现多服务环境切换
前端·uni-app
源猿人13 分钟前
文化与代码的交汇:OpenCC 驱动的中文语系兼容性解决方案
前端·vue.js
xw516 分钟前
uni-app项目怎么实现多服务环境切换
前端·uni-app
Kjjia17 分钟前
到底是 react 性能拉胯?还是吃了机制的亏
前端·react.js
ViceBoy_18 分钟前
前端的Promise的方法all,race,any
前端·javascript
飞翔的猪猪26 分钟前
GitHub Recovery Codes - 用于 GitHub Two-factor authentication (2FA) 凭据丢失时登录账号
前端·git·github
Simple_core28 分钟前
qt3d自定义生成mesh图形
开发语言·qt·3d
前端开发熊30 分钟前
实时薪资追踪-每秒都让收入看得见的 Chrome 扩展,你还不来试试?
前端
bnnnnnnnn32 分钟前
看完就懂、懂完就敢讲的「原型与原型链」终极八卦!
前端·javascript·面试
zacksleo34 分钟前
哪些鸿蒙原生应用在使用Flutter
前端·flutter·harmonyos