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

使用Python向IPFS上传文件的API调用疑问及问题排查

解决IPFS本地文件上传的API调用问题

一、先修复代码里的基础语法错误

你的原代码有几个明显的语法问题,先补上:

  • 函数定义末尾要加冒号:def upload_file_to_ipfs():
  • open(file_path, "rb) 要闭合引号:open(file_path, "rb")
  • 别忘了导入 requests 库(代码里没看到导入,必须加上)

二、适配本地IPFS节点的API调用逻辑

你之前用的是第三方网站的API接口,本地IPFS节点的文件上传接口是 /v0/add,不是 /v0/files,具体调整如下:

  1. 确认API地址:从你的IPFS状态页找API地址,本地节点默认是 http://localhost:5001,所以完整的上传端点是 http://localhost:5001/v0/add。

  2. 调整请求参数:

    • 本地IPFS节点默认不需要 Authorization 头,除非你手动配置了API认证,直接删掉这个头就行。
    • 上传单个文件时,files 参数保持 {"file": file} 就可以;如果要传整个文件夹,得在URL后面加 ?recursive=true,同时把文件夹里的所有文件按相对路径传给请求。
  3. 完整可运行的示例代码:

import requests

LIMIT = 5  # 替换成你实际的循环限制值

def upload_file_to_ipfs():
    idx = 1
    while idx != LIMIT:
        file_path = "PATH/TO/FILE.ext"  # 替换成你的目标文件路径
        # 用with语句自动关闭文件,比直接open更安全
        with open(file_path, "rb") as file:
            # 调用本地IPFS节点的上传API
            response = requests.post(
                "http://localhost:5001/v0/add",
                files={"file": file}
            )
        
        # 处理上传响应,提取CID
        if response.status_code == 200:
            result = response.json()
            cid = result["Hash"]
            print(f"文件上传成功,CID: {cid}")
            # 这里可以把CID存到本地文件或数据库,方便后续访问
        else:
            print(f"上传失败,状态码: {response.status_code},错误信息: {response.text}")
        
        idx += 1

if __name__ == "__main__":
    upload_file_to_ipfs()

三、上传后查看文件的正确方法

上传成功后,得用IPFS网关访问文件:

  • 本地网关访问:http://localhost:8080/ipfs/<你的文件CID>
  • 如果你的节点有公网网关,直接用状态页里的Gateway地址加上CID就行

之前你看不到上传的文件,大概率是这几个原因:

  • 用错了API端点,文件根本没传到你的IPFS节点
  • 上传后节点还没完成同步,等个几秒再试
  • 把文件夹的CID和单个文件的CID搞混了,要确保用的是上传文件时返回的那个CID

四、上传整个文件夹的额外说明

如果要上传带结构的文件夹,修改请求URL为 http://localhost:5001/v0/add?recursive=true,同时遍历文件夹里的所有文件并保持相对路径,示例片段:

import os
import requests

folder_path = "PATH/TO/YOUR/FOLDER"
files_to_upload = []

# 遍历文件夹,收集所有文件的相对路径和文件对象
for root, dirs, files in os.walk(folder_path):
    for file in files:
        full_path = os.path.join(root, file)
        relative_path = os.path.relpath(full_path, folder_path)
        files_to_upload.append(("file", (relative_path, open(full_path, "rb"))))

# 调用API上传整个文件夹
response = requests.post(
    "http://localhost:5001/v0/add?recursive=true",
    files=files_to_upload
)

if response.status_code == 200:
    # 文件夹上传会返回根目录的CID
    for item in response.json():
        if item["Name"] == "":
            print(f"文件夹上传成功,根目录CID: {item['Hash']}")
else:
    print(f"文件夹上传失败: {response.text}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:52:22