Can't decrypt file

go-ipfs
#1

Hi all .I am trying to get file from ipfs network

Here is my code

var (
		fname  = req.Cid
		output = req.Output
	)

	cID, _ := cid.Parse(fname)

	node, err := core.Node.IpfsNode.DAG.Get(ctx, cID)

	if err != nil {
		return &api.FileResponse{}, err
	}

	data := node.RawData()

	f, err := os.OpenFile(output, os.O_CREATE|os.O_RDWR, 0644)

	if err != nil {
		return &api.FileResponse{}, errors.New(fmt.Sprintf("Error  : %v", err))
	}

	defer f.Close()

	_, err = f.Write(data)

	if err != nil {
		return &api.FileResponse{}, errors.New(fmt.Sprintf("Error  : %v", err))
	}

	return &api.FileResponse{}, nil

But then in the output file either empty or has unknown format!

Please help to solve this problem

#2

Use github.com/ipfs/go-ipfs/core/coreapi.NewCoreAPI to construct a “core API” from that IpfsNode instance. Then, with that, you can call Unixfs().Get(context, filepath) to get the file.

At the moment, you’re reading the underlying datastructures that make up an IPFS file (think inodes).

#3

in my case the Unixfs() returns an interface look like this

type UnixfsAPI interface {
	// Add imports the data from the reader into merkledag file
	Add(context.Context, io.Reader) (Path, error)

	// Cat returns a reader for the file
	Cat(context.Context, Path) (Reader, error)

	// Ls returns the list of links in a directory
	Ls(context.Context, Path) ([]*ipld.Link, error)
}

There is not function called Get

#4

Also I have only file hash like Qm… . How can I parse hash to path ?

#5

Newer versions of this API use Get and return a special “files” object (that can be a either a directory or a file). In your case, use Cat.

You’ll have to call interface-go-ipfs-core.ParsePath.

#6

Thank you very much, I have already solved this problem as you said.