概述: 用Go从Swarm下载文件的教程。

从Swarm下载文件

上个章节 我们将一个hello.txt文件上传到swarm,作为返回值,我们得到了一个内容清单哈希。

  1. manifestHash := "f9192507e2e8e118bfedac428c3aa1dec4ae156e954128ec5fb27f63ee67bcac"

让我们首先通过调用“DownloadManfest”来下载它,并检查清单的内容。

  1. manifest, isEncrypted, err := client.DownloadManifest(manifestHash)
  2. if err != nil {
  3. log.Fatal(err)
  4. }

我们可以遍历清单条目,看看内容类型,大小和内容哈希是什么。

  1. for _, entry := range manifest.Entries {
  2. fmt.Println(entry.Hash) // 42179060941352ba7b400b16c40f1e1290423a826de2a70587034dc14bc4ab2f
  3. fmt.Println(entry.ContentType) // text/plain; charset=utf-8
  4. fmt.Println(entry.Path) // ""
  5. }

如果您熟悉swarm url,它们的格式为bzz:/ <hash> / <path>,因此为了下载文件,我们指定了清单哈希和路径。 在这个例子里,路径是一个空字符串。 我们将这些数据传递给Download函数并返回一个文件对象。

  1. file, err := client.Download(manifestHash, "")
  2. if err != nil {
  3. log.Fatal(err)
  4. }

我们现在可以阅读并打印返回的文件阅读器的内容。

  1. content, err := ioutil.ReadAll(file)
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. fmt.Println(string(content)) // hello world

正如预期的那样,它记录了我们原始文件所包含的 hello world

完整代码

Commands

  1. geth account new
  2. export BZZKEY=970ef9790b54425bea2c02e25cab01e48cf92573
  3. swarm --bzzaccount $BZZKEY

swarm_download.go

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. bzzclient "github.com/ethereum/go-ethereum/swarm/api/client"
  7. )
  8. func main() {
  9. client := bzzclient.NewClient("http://127.0.0.1:8500")
  10. manifestHash := "2e0849490b62e706a5f1cb8e7219db7b01677f2a859bac4b5f522afd2a5f02c0"
  11. manifest, isEncrypted, err := client.DownloadManifest(manifestHash)
  12. if err != nil {
  13. log.Fatal(err)
  14. }
  15. fmt.Println(isEncrypted) // false
  16. for _, entry := range manifest.Entries {
  17. fmt.Println(entry.Hash) // 42179060941352ba7b400b16c40f1e1290423a826de2a70587034dc14bc4ab2f
  18. fmt.Println(entry.ContentType) // text/plain; charset=utf-8
  19. fmt.Println(entry.Size) // 12
  20. fmt.Println(entry.Path) // ""
  21. }
  22. file, err := client.Download(manifestHash, "")
  23. if err != nil {
  24. log.Fatal(err)
  25. }
  26. content, err := ioutil.ReadAll(file)
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. fmt.Println(string(content)) // hello world
  31. }