1. 首页
  2. 文档
  3. IPFS
  4. 指南|Guides
  5. 指南
  6. 传输文件

传输文件

本文档是帮助解决使用IPFS在两台计算机之间传输文件的问题的指南。

文件传输

首先,确保IPFS在两台计算机上运行。要验证,请在每台计算机上运行ipfs id并检查该Addresses字段中是否包含任何内容。如果它显示null,那么您的节点不在线,您将需要运行ipfs daemon

现在,让我们将您要传输文件的节点称为节点“A”,将文件传输到的节点称为节点“B”。在节点A上,使用ipfs add命令将文件添加到IPFS。这将打印出您添加的内容的多重哈希。现在,在节点B上,您可以使用ipfs get <hash>来获取内容。

# On A
> ipfs add myfile.txt
added QmZJ1xT1T9KYkHhgRhbv8D7mYrbemaXwYUkg7CeHdrk1Ye myfile.txt

# On B
> ipfs get QmZJ1xT1T9KYkHhgRhbv8D7mYrbemaXwYUkg7CeHdrk1Ye
Saving file(s) to QmZJ1xT1T9KYkHhgRhbv8D7mYrbemaXwYUkg7CeHdrk1Ye
 13 B / 13 B [=====================================================] 100.00% 1s

如果命令有效,并下载了文件,那么恭喜您!您刚刚使用IPFS在互联网上传输了文件!但是,如果该ipfs get命令挂起,没有输出,请继续阅读。

故障排除

之所以你的IPFS文件传输似乎无法正常工作,其主要原因是因为节点B无法弄清楚如何连接到节点A,或者节点B甚至不知道它必须连接到节点A。

检查现有连接

首先要做的是仔细检查两个节点确实在运行并且是在线运行。为此,请在每台计算机上运行ipfs id。如果两个节点都显示某些地址(如下例所示),那么您的节点就在线了。

{
        "ID": "QmTNwsFkLAed15kQEC1ZJWPfoNbBQnMFojfJKQ9sZj1dk8",
        "PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZb6znj3LQZKP1+X81exf+vbnqNCMtHjZ5RKTCm7Fytnfe+AI1fhs9YbZdkgFkM1HLxmIOLQj2bMXPIGxUM+EnewN8tWurx4B3+lR/LWNwNYcCFL+jF2ltc6SE6BC8kMLEZd4zidOLPZ8lIRpd0x3qmsjhGefuRwrKeKlR4tQ3C76ziOms47uLdiVVkl5LyJ5+mn4rXOjNKt/oy2O4m1St7X7/yNt8qQgYsPfe/hCOywxCEIHEkqmil+vn7bu4RpAtsUzCcBDoLUIWuU3i6qfytD05hP8Clo+at+l//ctjMxylf3IQ5qyP+yfvazk+WHcsB0tWueEmiU5P2nfUUIR3AgMBAAE=",
        "Addresses": [
                "/ip4/127.0.0.1/tcp/4001/ipfs/QmTNwsFkLAed15kQEC1ZJWPfoNbBQnMFojfJKQ9sZj1dk8",
                "/ip4/192.168.2.131/tcp/4001/ipfs/QmTNwsFkLAed15kQEC1ZJWPfoNbBQnMFojfJKQ9sZj1dk8",
        ],
        "AgentVersion": "go-ipfs/0.4.11-dev/",
        "ProtocolVersion": "ipfs/0.1.0"
}

接下来,检查节点是否彼此连接。您可以通过ipfs swarm peers在一个节点上运行并检查输出中的其他对等节点的ID来执行此操作。如果这两个节点连接,但ipfs get命令仍然挂起,则可能发生了一些意外情况,我建议提交有关它的问题。如果它们没有连接,那么让我们尝试调试原因。(注意:如果您只是想要工作,可以跳到’手动将节点A连接到节点B’。完成调试过程并将情况报告IRC上的IFPS团队,有助于我们理解人们的常见问题)。

检查供应商

在IFPS上请求内容时,节点会在DHT中搜索“提供者记录”,以查看谁拥有哪些内容。让我们在节点B上手动执行此操作,以确保节点B能够确定节点A拥有数据。运行ipfs dht findprovs <hash>。我们希望看到节点A的对等ID打印出来。如果此命令不返回任何内容(或返回不是节点A的ID),则网络上不存在A具有该数据的的记录。如果在节点A没有运行守护程序的情况下添加数据,则会发生这种情况。如果发生这种情况,您可以在节点A上运行ipfs dht provide <hash>以向网络通知您具有该哈希值。然后,如果重新启动ipfs get命令,节点B现在应该能够分辨节点A具有它想要的内容。如果节点A的对等ID出现在了第一次的findprovs 调用,或手动提供哈希没有解决问题,那么节点B很可能无法连接到节点A。

检查地址

在节点B单纯不能形成到节点A的连接的情况下,尽管B知道它需要进行连接,那么可能的罪魁祸首就是糟糕的网络穿透。当节点B获知它需要连接到节点A时,它检查分布式哈希表以查找节点A的地址,然后开始尝试连接它们。我们可以通过在节点B上运行ipfs dht findpeer <node A peerID>来检查这些地址。该命令应返回节点A的地址列表。如果它没有返回任何地址,那么您应该尝试运行前面步骤中的手动提供命令。地址输出示例可能如下所示:

/ip4/127.0.0.1/tcp/4001
/ip4/192.168.2.133/tcp/4001
/ip4/88.157.217.196/tcp/63674

在这种情况下,我们可以看到localhost(127.0.0.1)地址,LAN地址(192.168...)和另一个地址。如果这第三个地址与您的对外IP匹配,则网络知道您的节点的有效对外地址。此时,可以假设您的节点在NAT网络穿透遍历上有一些困难。如果是这种情况,您可以尝试在节点A的路由器上启用UPnP或NAT-PMP,然后重试该过程。否则,您可以尝试手动将节点A连接到节点B.

手动将节点A连接到B

在节点B上运行ipfs id并获取包含其公共IP地址的多重地址之一,然后在节点A上运行ipfs swarm connect <multiaddr>。您也可以尝试使用中继连接,有关详细信息,请阅读此文档。如果仍然无效,那么您应该加入IRC并在那里寻求帮助,或者在github上提出问题。

如果此手动步骤确实有效,那么您可能遇到NAT网络穿透遍历问题,而IPFS无法弄清楚如何解决它。请向我们报告此类情况,以便我们可以修复它们。

标签 , , ,
   这篇文档对你有帮助吗?

How can we help?