如何通过CID获取IPFS传输文件的扩展名?
解决IPFS下载文件保留扩展名的问题
方法1:上传记录原文件名,下载后重命名
调用client.add()时,返回结果里的res["Name"]包含了原文件的完整名称(带扩展名)。可以在上传时保存这个名称,下载完成后对文件重命名。
修改后的代码示例:
import ipfshttpclient import os import shutil # 连接IPFS守护进程 client = ipfshttpclient.connect() def share_file(filepath): # 上传文件到IPFS res = client.add(filepath) ipfs_hash = res["Hash"] original_filename = res["Name"] print(f"IPFS哈希值:{ipfs_hash},原文件名:{original_filename}") return ipfs_hash, original_filename # 上传文件,获取CID和原文件名 ipfs_hash, original_filename = share_file("DSC00001.jpg") # 下载文件到指定文件夹 download_dir = "download_jpg_file" client.get(ipfs_hash, download_dir) # 重命名文件:将CID命名的文件改为原文件名 cid_file_path = os.path.join(download_dir, ipfs_hash) target_file_path = os.path.join(download_dir, original_filename) # 若目标文件已存在则删除(可选操作) if os.path.exists(target_file_path): os.remove(target_file_path) shutil.move(cid_file_path, target_file_path) print(f"文件已保存为:{target_file_path}")
方法2:直接读取内容写入带扩展名的文件
这种方法跳过下载CID命名文件的步骤,通过client.cat()获取文件二进制内容,直接写入带原扩展名的目标文件,流程更简洁。
代码示例:
import ipfshttpclient import os # 连接IPFS守护进程 client = ipfshttpclient.connect() def share_file(filepath): res = client.add(filepath) ipfs_hash = res["Hash"] original_filename = res["Name"] print(f"IPFS哈希值:{ipfs_hash},原文件名:{original_filename}") return ipfs_hash, original_filename ipfs_hash, original_filename = share_file("DSC00001.jpg") download_dir = "download_jpg_file" # 确保下载目录存在 os.makedirs(download_dir, exist_ok=True) target_file_path = os.path.join(download_dir, original_filename) # 获取文件内容并写入目标文件 with open(target_file_path, "wb") as f: f.write(client.cat(ipfs_hash)) print(f"文件已保存为:{target_file_path}")
补充说明
- 两种方法都依赖
client.add()返回的res["Name"]获取原文件名(含扩展名),该值为上传时文件的原始名称。 - 批量处理文件时,可将CID与对应文件名存储到字典或本地文件中,后续下载时匹配使用。
内容的提问来源于stack exchange,提问作者Juki
相关产品推荐
相关产品推荐

