0

我是 Javascript 和 ipfs 的新手,我正在尝试使用 ipfs-mini 节点模块从 ipfs 哈希“QmdD8FL7N3kFnWDcPSVeD9zcq6zCJSUD9rRSdFp9tyxg1n”中获取图像缓冲区。
下面是我的代码


const IPFS = require('ipfs-mini'); 
const FileReader = require('filereader');
var multer = require('multer');
const ipfs = initialize();

     app.post('/upload',function(req,res){
     upload(req,res, function(err){
        console.log(req.file.originalname);
        ipfs.cat('QmdD8FL7N3kFnWDcPSVeD9zcq6zCJSUD9rRSdFp9tyxg1n', function(err, data){
          if(err) console.log("could not get the image from the ipfs for hash " + ghash);
          else {
              var wrt = data.toString('base64');
              console.log('size ; ' + wrt.length);
              fs.writeFile('tryipfsimage.gif',wrt, (err) =>{
              if(err)console.log('can not write file');
              else {
                //console.log(data);
                ipfs.stat('QmdD8FL7N3kFnWDcPSVeD9zcq6zCJSUD9rRSdFp9tyxg1n', (err, data)=>{
                  //  console.log(hexdump(wrt));
                });
                console.log("files written successfully");
              }
          });
        }
      });
    });
    });
     function initialize() {
       console.log('Initializing the ipfs object');
       return new IPFS({
         host: 'ipfs.infura.io',
         protocol: 'https'
       });
     }

我可以使用下面的链接“ https://ipfs.io/ipfs/QmdD8FL7N3kFnWDcPSVeD9zcq6zCJSUD9rRSdFp9tyxg1n ”在浏览器中正确查看图像,但是如果我打开文件'tryipfsimage.gif',我将cat API的返回缓冲区转储到上面的程序,图像的内容似乎已损坏。我不确定我在代码中犯了什么错误。如果有人指出我的错误,那就太好了。

4

1 回答 1

0

来自 ipfs 文档https://github.com/ipfs/interface-ipfs-core/blob/master/SPEC/FILES.md#javascript---ipfsfilesctipfspath-callback

回调中的文件实际上是一个Buffer所以通过toString('base64')'ing它你正在将实际的base64写入.gif文件 - 不需要这样做。您可以将缓冲区直接传递给 fs.writeFile api

fs.writeFile('tryipsimage.gif', file, ...

对于较大的文件,我建议使用 ipfs catReadableStream,您可以在其中执行以下操作:

const stream = ipfs.catReadableStream('QmdD8FL7N3kFnWDcPSVeD9zcq6zCJSUD9rRSdFp9tyxg1n')

// don't forget to add error handlers to stream and whatnot
const fileStream = fs.createWriteStream('tryipsimage.gif')

stream.pipe(fileStream);
于 2018-03-25T17:23:04.683 回答