title: ipfs使用

date: "2019-09-26 10:17:16"

tags: ipfs

categories: 技术驿站


1.mac安装ipfs——使用npm工具

sudo npm install ipfs --global

2.本地上传文件并同步网络

  1. touch index.html

  2. vim index.html

  3. 初始化过程,生成本地节点

ipfs init

  1. 保存在本地ipfs

ipfs add index.html

  1. 同步到网络中

ipfs daemon

注意链接的格式:https://ipfs.io/ipfs/QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o

3.ipfs项目

  1. ipfs-desktop

https://github.com/ipfs-shipyard/ipfs-desktop

4. ipfs后台界面

localhost:5001/webui


5.与浏览器交互

  1. npm install -g create-react-app

  2. create-react-app ipfs-demo

  3. 进入ipfs-demo文件夹,安装ipfsjs模块

    npm install ipfs-api --save

    ipfs-api改名字了,改成ipfs-http-client了

    会发现package.json文件依赖会多出ipfs-api

  1. 解决跨域,端口不一致问题
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT","GET", "POST", "OPTIONS"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Headers '["Authorization"]'
ipfs config --json API.HTTPHeaders.Access-Control-Expose-Headers '["Location"]'

使用ipfs config show就会看到config配置多出了API配置:

  1. 运行react项目

    npm start

  2. 修改App.js文件内容——(react必学)

    import React, { Component } from 'react';
    import './App.css'; class App extends Component { constructor(props) {
    super(props);
    this.state = {
    strHash: null,
    strContent: null
    }
    } render() {
    return (
    <div className="App">
    <input
    ref="ipfsContent"
    />
    <button onClick={() => {
    let ipfsContent = this.refs.ipfsContent.value;
    console.log(ipfsContent);
    }}>提交到IPFS</button> <p>{this.state.strHash}</p> <button onClick={() => {
    console.log('从ipfs读取数据。')
    }}>读取数据</button>
    <h1>{this.state.strContent}</h1>
    </div>
    );
    }
    } export default App;

    当我们在输入框中输入一个字符串时,点击提交到IPFS按钮,将文本框中的内容取出来打印,之后我们将这个数据上传到IPFS。点击读取数据按钮,我们也只是随便打印了一个字符串,后面需要从IPFS读取数据,然后将读取的数据存储到状态机变量strContent中并且展示出来。

  3. 导入ipfs模块并使用

    const ipfsAPI = require('ipfs-api');
    const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});
  4. 编写上传大文本字符串到IPFS的Promise函数

    saveTextBlobOnIpfs = (blob) => {
    return new Promise(function(resolve, reject) {
    const descBuffer = Buffer.from(blob, 'utf-8');
    ipfs.add(descBuffer).then((response) => {
    console.log(response)
    resolve(response[0].hash);
    }).catch((err) => {
    console.error(err)
    reject(err);
    })
    })
    }

    response[0].hash返回的是数据上传到IPFS后返回的HASH字符串。

  5. 上传数据到IPFS

    this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {
    console.log(hash);
    this.setState({strHash: hash});
    });

    ipfsContent是从文本框中取到的数据,调用this.saveTextBlobOnIpfs方法将数据上传后,会返回字符串hash,并且将hash存储到状态机变量strHash中。

  6. 提交数据的完整代码

    import React, {Component} from 'react';
    import './App.css'; const ipfsAPI = require('ipfs-api');
    const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'}); class App extends Component { constructor(props) {
    super(props);
    this.state = {
    strHash: null,
    strContent: null
    }
    } saveTextBlobOnIpfs = (blob) => {
    return new Promise(function(resolve, reject) {
    const descBuffer = Buffer.from(blob, 'utf-8');
    ipfs.add(descBuffer).then((response) => {
    console.log(response)
    resolve(response[0].hash);
    }).catch((err) => {
    console.error(err)
    reject(err);
    })
    })
    } render() {
    return (<div className="App">
    <input ref="ipfsContent" />
    <button onClick={() => {
    let ipfsContent = this.refs.ipfsContent.value;
    console.log(ipfsContent);
    this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {
    console.log(hash);
    this.setState({strHash: hash});
    });
    }}>提交到IPFS</button> <p>{this.state.strHash}</p> <button onClick={() => {
    console.log('从ipfs读取数据。')
    }}>读取数据</button>
    <h1>{this.state.strContent}</h1>
    </div>);
    }
    } export default App;
  7. 刷新网页看后台数据

  8. 从ipfs读取数据

ipfs.cat(this.state.strHash).then((stream) => {
console.log(stream);
let strContent = Utf8ArrayToStr(stream);
console.log(strContent);
this.setState({strContent: strContent});
});

stream为Uint8Array类型的数据,下面的方法是将Uint8Array转换为string字符串。

function Utf8ArrayToStr(array) {
var out, i, len, c;
var char2, char3; out = "";
len = array.length;
i = 0;
while(i < len) {
c = array[i++];
switch(c >> 4)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12: case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
default:
break;
}
} return out;
}
  1. 完整源码
import React, {Component} from 'react';
import './App.css'; const ipfsAPI = require('ipfs-api');
const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'}); function Utf8ArrayToStr(array) {
var out,
I,
len,
c;
var char2,
char3; out = "";
len = array.length;
i = 0;
while (i < len) {
c = array[i++];
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
break;
default:
break;
}
} return out;
} class App extends Component { constructor(props) {
super(props);
this.state = {
strHash: null,
strContent: null
}
} saveTextBlobOnIpfs = (blob) => {
return new Promise(function(resolve, reject) {
const descBuffer = Buffer.from(blob, 'utf-8');
ipfs.add(descBuffer).then((response) => {
console.log(response)
resolve(response[0].hash);
}).catch((err) => {
console.error(err)
reject(err);
})
})
} render() {
return (<div className="App">
<input ref="ipfsContent" />
<button onClick={() => {
let ipfsContent = this.refs.ipfsContent.value;
console.log(ipfsContent);
this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {
console.log(hash);
this.setState({strHash: hash});
});
}}>提交到IPFS</button> <p>{this.state.strHash}</p> <button onClick={() => {
console.log('从ipfs读取数据。')
ipfs.cat(this.state.strHash).then((stream) => {
console.log(stream);
let strContent = Utf8ArrayToStr(stream);
console.log(strContent);
this.setState({strContent: strContent});
});
}}>读取数据</button>
<h1>{this.state.strContent}</h1>
</div>);
}
} export default App;
  1. 预览结果

11.IPFS搭建及上传获取数据——2019年12月12日的更多相关文章

  1. 易初大数据——2019年10月17日 王庆超 spss

    开放数据库链接是为解决异构数据库间的数据共享而产生, 现已成为WOSA的主要部分和基于windows环境的一种数据库访问接口和标准ODOC为异构数据库访问提供统一接口,允许应用程序以SOL.为数据存取 ...

  2. 易初大数据 2019年10月24日 spss笔记 王庆超

    数据文件的重置结构:横向结构(个案组),纵向结构,不符合分析方法的时候就需要重组,选定变量重组为个案,数据—重构,重构数据向导,选定变量重组为个案,将选定个案重构位变量,转置所有数据,变量组数目,一个 ...

  3. 易初大数据 2019年10月20日 spss习题 王庆超

    一.选择题 1.有关spss数据字典的说法,正确的是:D A.SPSS数据集的数据字典可以复制到其他数据集中 B.SPSS数据集的数据字典是不能复制的 C.SPSS的数据字典可以通过“复制”和“黏贴” ...

  4. 易初大数据 2019年10月20日 linux死亡导图 王庆超

  5. Thinkphp5+PHPExcel实现批量上传表格数据功能

    http://www.jb51.net/article/129262.htm 1.首先要下载PHPExcel放到vendor文件夹下,我的路径是:项目/vendor/PHPExcel/,把下载的PHP ...

  6. Android 本地tomcat服务器接收处理手机上传的数据之案例演示

    上一篇:Android 本地tomcat服务器接收处理手机上传的数据之环境搭建     本篇基于上一篇搭建的服务器端环境,具体介绍Android真机上传数据到tomcat服务器的交互过程   场景:A ...

  7. 2、网络并发编程--套接字编程、黏包问题、struct模块、制作简易报头、上传文件数据

    昨日内容回顾 面向对象复习(json序列化类) 对象.类.父类的概念 三大特性:封装 继承 多态 双下开头的方法(达到某个条件自动触发) __init__:对象实例化自动触发 __str__:对象执行 ...

  8. 使用Hue上传hive数据

    大概逻辑是先上传hdfs数据,然后创建hive外部表,关联到hdfs上传数据的位置. 截图比较概要,但是用起来很简单 1.创建路径和上传文件 2.创建外部表

  9. bootstrap上传表单的时候上传的数据默认是0 一定要小心

    bootstrap上传表单的时候上传的数据默认是0 一定要小心

随机推荐

  1. 攻防世界 | string

    #encoding=utf-8 #!usr/bin/python from pwn import * io = remote('111.198.29.45',42643) io.recvuntil(& ...

  2. 电脑如何连接windows server服务器

    第一步:win+r 启动‘运行’,输入mstsc 第二步:连接远程桌面,输入服务器ip 第三步,输入账户密码,登陆即可. 注释:mstsc,全称 Microsoft Telnet Screen Con ...

  3. 为什么从pycharm中打开的html文件会显示404?

    问题如图: 解决办法: 某次发现运行导入的html文件的时候,打开浏览器会报404错误:而运行自己写的html文件则正常显示:最后发现这是pycharm缓存问题,只需重启pycharm清除缓存就ok啦 ...

  4. 怎样用idhttpserver代替IIS让用户浏览html或下载文件 http://bbs.csdn.net/topics/360248674

      怎样用idhttpserver代替IIS让用户浏览html或下载文件 更多0分享到: 相关知识库: C# 虚拟现实(VR) Node.js 算法与数据结构     对我有用[0] 丢个板砖[0]  ...

  5. WildFly的学习

    1. WildFly介绍: WildFly,前身是JBoss AS,从V8开始为区别于JBoss EAP,更名为WildFly. 由红帽 (Red Hat)开发,是另一个功能齐全且经过认证的应用服务器 ...

  6. mybatis中Oracle分页语句的写法

    最近一段时间使用oracle数据库查询分页, 用的是springboot. Oracle数据库中没有像mysql中limit的写法, 只能换其他方式写. 考虑到oracle中的ROWNUM变量, 使用 ...

  7. maven添加oracle和sqlserver报错

    Failure to find com.oracle:ojdbc6:jar:12.1.0.1-atlassian-hosted in 'xxx' Missing artifact com.micros ...

  8. Spring学习(一)--简化Java开发,认识Spring

    一.传统Java开发弊端 在传统的开发之中,任何一个有实际意义的应用都会由两个或更多的类所组成,这些类之间相互协调来完成特定的业务逻辑,按照传统的做法,每个对象负责管理与自己相互协作的对象(即他所依赖 ...

  9. [Codeforces 280D]k-Maximum Subsequence Sum(线段树)

    [Codeforces 280D]k-Maximum Subsequence Sum(线段树) 题面 给出一个序列,序列里面的数有正有负,有两种操作 1.单点修改 2.区间查询,在区间中选出至多k个不 ...

  10. P2639 [USACO09OCT]Bessie的体重问题Bessie's Weight

    题目传送门 这题和01背包最大的区别在于它没有价值,所以我们可以人工给它赋一个价值,由于要求体积最大,把价值赋成体积即可.顺带一提,这题数据范围很大,二维会MLE,要压缩成一维才可以AC 下面给出参考 ...