1. 程式人生 > >使用React前端框架結合js-ipfs-api實現IPFS的文字資料流傳輸

使用React前端框架結合js-ipfs-api實現IPFS的文字資料流傳輸

本文我們將通過React這個js前端框架來實現一個簡易的頁面,通過官方提供的js-ipfs-api,我們可以在頁面的文字框中輸入任意文字,然後提交上傳到IPFS節點網路中,再利用hash引數把上傳的文字資料顯示出來。

React簡介及安裝

React是由Facebook和Instagram來開發的一種用來建立使用者介面的JavaScript庫。

首先你要保證電腦上已經安裝了Node.js的最近版本,然後可以根據安裝教程來建立新專案。

npm install -g create-react-app
[email protected]-sily:~$ npm install -g
create-react-app /home/sily/.nvm/nvm/versions/node/v9.3.0/bin/create-react-app -> /home/sily/.nvm/nvm/versions/node/v9.3.0/lib/node_modules/create-react-app/index.js + create-react-app@1.5.2 added 114 packages in 26.067s [email protected]-sily:~$ create-react-app --version 1.5.2
React專案建立
[email protected]
-sily:~$ create-react-app ipfs-demo Creating a new React app in /home/sily/ipfs-demo. Installing packages. This might take a couple of minutes. Installing react, react-dom, and react-scripts... > uglifyjs-webpack-plugin@0.4.6 postinstall /home/sily/ipfs-demo/node_modules/uglifyjs-webpack-plugin > node lib/post_install.
js + react-scripts@1.1.1 + [email protected]16.2.0 + react-dom@16.2.0 added 1155 packages in 131.72s Success! Created ipfs-demo at /home/sily/ipfs-demo Inside that directory, you can run several commands: npm start Starts the development server. npm run build Bundles the app into static files for production. npm test Starts the test runner. npm run eject Removes this tool and copies build dependencies, configuration files and scripts into the app directory. If you do this, you can’t go back! We suggest that you begin by typing: cd ipfs-demo npm start Happy hacking!

在專案根目錄輸入npm start命令,檢視專案在瀏覽器的顯示效果:

mark

安裝js-ipfs-api
npm install --save ipfs-api

安裝成功會在專案node_modules目錄下多出ipfs-api資料夾,在package.json下增加依賴包資訊:

mark

新增UI邏輯

修改src/App.js裡面的程式碼,主要是render()中的頁面佈局:

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"
            style=/>
          <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中並展示出來。

匯入IPFS
const ipfsAPI = require('ipfs-api');
const ipfs = ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});
編寫上傳大文字字串到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字串。

上傳資料到IPFS
this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {
    console.log(hash);
    this.setState({strHash: hash});
});

ipfsContent是從文字框中取到的資料,呼叫this.saveTextBlobOnIpfs方法將資料上傳後,會返回字串hash,並且將hash儲存到狀態機變數strHash中。

跨域資源共享CORS配置

跨域資源共享(CORS)配置,依次在終端執行以下程式碼:

$ 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"]'
用正確的埠執行daemon
$ ipfs config Addresses.API
/ip4/127.0.0.1/tcp/5001
$ ipfs config Addresses.API /ip4/127.0.0.1/tcp/5001
$ ipfs daemon
從IPFS讀取資料
ipfs.cat(this.state.strHash).then((stream) => {
    console.log(stream);
    let strContent = Utf8ArrayToStr(stream);
    console.log(strContent);
    this.setState({strContent: strContent});
});

編寫Utf8ArrayToStr()方法將Uint8Array型別的stream變數轉換成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;
}

最終完整的App.js程式碼如下:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

const ipfsAPI = require('ipfs-api');
const ipfs = ipfsAPI({host:'localhost', port:'5001', protocal:'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"
          style={{width:200,height:30}}/>
        <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>
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
      </div>
    );
  }
}

export default App;
執行效果測試

mark

參考

相關推薦

使用React前端框架結合js-ipfs-api實現IPFS文字資料傳輸

本文我們將通過React這個js前端框架來實現一個簡易的頁面,通過官方提供的js-ipfs-api,我們可以在頁面的文字框中輸入任意文字,然後提交上傳到IPFS節點網路中,再利用hash引數把上傳的文字資料顯示出來。 React簡介及安裝 React是由

基於js-ipfs-api實現ipfs的檔案上傳與下載

配置本地的ipfs節點 # 初始化ipfs節點 ipfs init # 執行ipfs節點 ipfs daemon 使用js-ipfs-api呼叫ipfs服務 連線本地ipfs節點 const ipfsAPI = require('ip

前端框架Vue.js——vue-i18n ,vue項目中如何實現國際化

客戶端 效果 font 免費下載 賦值 視頻 安裝 定時 unp 每天學習一點點 編程PDF電子書、視頻教程免費下載:http://www.shitanlife.com/code 一、前言 趁著10月的最後一天,來寫一篇關於前端國際化的實踐型博客。國際化應該都

vue.js 對比 angularJS、react 前端框架

React React 和 Vue 有許多相似之處,它們都有: 使用 Virtual DOM提供了響應式(Reactive)和元件化(Composable)的檢視元件。將注意力集中保持在核心庫,而將其他功能如路由和全域性狀態管理交給相關的庫。 由於有著眾多的相似處,我

一款輕量級前端框架Avalon.Js

必須 ase component 使用 per 簡單 itl 前端框架 引導 avalon2是一款基於虛擬DOM與屬性劫持的 迷你、 易用、 高性能 的 前端MVVM框架, 擁有超優秀的兼容性, 支持移動開發, 後端渲染, WEB Component式組件開發, 無

2018.9.6 關於對前端框架Vue.js的理解

晚上19.35又是一個安靜的夜晚,趁著安靜,趕緊過來csdn總結一下今天學到vue的知識。 首先了解一個新的東西,必須瞭解它是什麼,能幹什麼。這是我比較深刻的體會。 什麼是Vue.js:  *** vue.js:是目前最火的框架(關注的人是最多的),而react是目前最流行的框

react前端框架dva(一)

react前端框架dva 最近正在看dva框架,發現這是一個很好應用於react的框架。 眾所周知,react的學習成本是較高的,而antd推出的這款框架,大大的降低了react的學習成本。dva簡化了 react-redux 的部署的檔案複雜度。使其清晰易

react前端框架dva(四)

dva.js 知識導圖不知大家學 react 或 dva 時會不會有這樣的疑惑:es6 特性那麼多,我需要全部學會嗎?react component 有 3 種寫法,我需要全部學會嗎?reducer 的增刪改應該怎麼寫?怎麼做全域性/區域性的錯誤處理?怎麼發非同步請求?怎麼處

web前端複習(二):js日期操作,實現時間顯示和倒計時效果

雖然jquery框架的封裝使得幾行程式碼就可以完成js的複雜功能的實現,但是jquery併為日期定製操作,所以日期的操作還是得使用js原生實現 下面我們就來簡單實現js日期操作,程式碼如下: &

前端MVC,JS模板替換實現原理

// model var data = { name: "splendid", age: 21, height: 173, weight: 60, hobby: "閱讀" }; // contr

前端框架vue.js系列(4):事件修飾符與按鍵修飾符

vue修飾符是指在觸發事件或按鍵時額外的觸發條件或回撥。比如點選事件只允許觸發一次,可以使用@click.once。 原生事件物件 vue可以通過以下方式,獲取原生的事件物件: <button @click="getEventDom($event);">

前端框架vue.js系列(10):生命週期鉤子函式

每個vue例項在被建立之前都要經過一系列的初始化過程。例如需要設定資料監聽、編譯模板、掛載例項到dom、在資料變化時更新dom等。同時在這個過程中也會執行一些叫做生命週期鉤子的函式,給予使用者機會在一些特定的場景下新增他們自己的程式碼。 下圖說明了例項的生命週期。你不需要立

前端框架vue.js詳解

Vue.js 是一個JavaScriptMVVM庫,是一套構建使用者介面的漸進式框架。 摘要 2016年最火的前端框架當屬Vue.js了,很多使用過vue的程式設計師這樣評價它,“vue.js兼具angular.js和react.js的優點,並剔除了它們的缺點”。授予了

(轉)2018幾大主流的UI/JS框架——前端框架 [Vue.js(目前市場上的主流)]

run rap 程序員 開發框架 同時 智能 帶來 行數 函數 https://blog.csdn.net/hu_belif/article/details/81258961 2016年開始應該是互聯網飛速發展的幾年,同時也是Web前端開發非常火爆

前端面試:js的繼承實現

前言 JS作為面向物件的弱型別語言,繼承也是其非常強大的特性之一。那麼如何在JS中實現繼承呢?讓我們拭目以待。 JS繼承的實現方式 既然要實現繼承,那麼首先我們得有一個父類,程式碼如下: // 定義一個動物類 function Animal (name) { // 屬性 this.name =

前端框架Vue.js的使用及具體頁面跳轉時的引數傳遞

由於專案急且前端開發人員只會拼頁面具體資料互動不會,只能我後臺開發人員來寫。因為是資料互動使用的是ajax方式,我首先要面臨的問題是我獲得的資料怎麼顯示在頁面上,以及怎麼把資料儲存下來,等頁面跳轉時就不用向後臺再次請求資料,比如使用者名稱以帳號相關基礎資訊,不可能每次開啟新

IPFS環境搭建和用ipfs-api訪問ipfs網路

ipfs是去中心化星際檔案系統,本文介紹節點軟體ipfs環境搭建和使用方法,學習ipfs-api在nodejs程式碼中訪問ipfs網路。 一、ipfs節點安裝與使用 1.1下載節點軟體 到官網下載windows版的ipfs節點軟體:32位,64位

js 和 ClipboardJS實現複製文字,相容移動端

<script src="js/clipboard.min.js"></script>//第一步當然是引入js 下載或者clone 程式碼到本地  裡面有 clipboard.min.js html <input type="t

Java使用jxl的api實現excel動態資料驗證及匯入匯出

首先從優缺點上來說 一、jxl 優點: Jxl對中文支援非常好,操作簡單,方法看名知意。 Jxl是純javaAPI,在跨平臺上表現的非常完美,程式碼可以再windows或者Linux上執行而無需重新編寫 支援Excel 95-2000的所有版本(網上說目前可以支援Ex

乾貨 | 呼叫AI api 實現網頁文字朗讀

  京東雲上提供了足夠多的人工智慧api,並且都使用了http的方式進行了封裝,使用者可以方便在自己的系統