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

浏览器端使用nft.storage上传引入fs模块报错该如何解决

错误原因

你遇到的报错本质是fs是Node.js 专属的内置文件系统模块,完全不支持浏览器环境。所有基于fs封装的fs-extra、graceful-fs等包也都是Node端专用,不可能在浏览器里运行。同时浏览器出于安全限制,也不允许JS直接通过路径读取本地磁盘文件,必须通过用户主动触发的文件选择交互获取文件。

解决步骤

1. 新增HTML文件选择控件

首先在页面中添加文件选择入口,允许用户手动选中要上传的本地文件:

<input type="file" id="filePicker" multiple>
<button id="upload-file-ipfs">上传到IPFS</button>
<pre id="out"></pre>

2. 调整JS代码

删除所有fs相关的导入和调用逻辑,直接从文件选择控件获取用户选中的File对象传入storeDirectory即可:

<script type="module">
  import { NFTStorage, File } from 'https://cdn.skypack.dev/nft.storage'

  const endpoint = 'https://api.nft.storage'
  const token = '你的API密钥' // 替换为你自己的nft.storage密钥

  function log(msg) {
    msg = JSON.stringify(msg, null, 2)
    document.getElementById('out').innerHTML += `${msg}\n`
  }

  document.querySelector('#upload-file-ipfs').addEventListener('click', async (e) => {
    e.preventDefault()
    // 获取用户选中的文件列表
    const fileInput = document.getElementById('filePicker')
    if (fileInput.files.length === 0) {
      log('请先选择要上传的文件')
      return
    }

    const storage = new NFTStorage({ endpoint, token })
    // 直接把文件对象数组传入storeDirectory即可
    const cid = await storage.storeDirectory(fileInput.files)
    log({ cid })
    const status = await storage.status(cid)
    log(status)
  })
</script>

3. 可选:自定义文件路径

如果你需要把上传的文件放到指定的文件夹层级,可以手动调整File的名称前缀,比如:

const files = Array.from(fileInput.files).map(file => {
  // 所有文件都放到assets文件夹下
  return new File([file], `assets/${file.name}`)
})
const cid = await storage.storeDirectory(files)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:06:09