使用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,具体调整如下:
确认API地址:从你的IPFS状态页找API地址,本地节点默认是
http://localhost:5001,所以完整的上传端点是http://localhost:5001/v0/add。调整请求参数:
- 本地IPFS节点默认不需要
Authorization头,除非你手动配置了API认证,直接删掉这个头就行。 - 上传单个文件时,
files参数保持{"file": file}就可以;如果要传整个文件夹,得在URL后面加?recursive=true,同时把文件夹里的所有文件按相对路径传给请求。
- 本地IPFS节点默认不需要
完整可运行的示例代码:
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
相关产品推荐
相关产品推荐

