blockchain:dappsからipfsにファイルをアップロードする
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
blockchain:dappsからipfsにファイルをアップロードする [2022/06/07 08:43] – dot | blockchain:dappsからipfsにファイルをアップロードする [2022/06/16 12:54] (現在) – dot | ||
---|---|---|---|
行 1: | 行 1: | ||
====== DAppsからIPFSにファイルをアップロードする ====== | ====== DAppsからIPFSにファイルをアップロードする ====== | ||
+ | |||
+ | React で Web アプリケーションを実装し、HTML の FILE API で指定されたファイルを IPFS にアップロードする機能を実現します。 | ||
===== React プロジェクトの作成 ===== | ===== React プロジェクトの作成 ===== | ||
行 11: | 行 13: | ||
IPFS\ipfs-web> | IPFS\ipfs-web> | ||
</ | </ | ||
+ | |||
+ | 「[[https:// | ||
===== 参考 ===== | ===== 参考 ===== | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
===== IPFSUploader.tsx の実装 ===== | ===== IPFSUploader.tsx の実装 ===== | ||
+ | |||
+ | IPFS にファイルをアップロードする機能を提供する IPFSUploader.tsx コンポーネントを実装します。 | ||
+ | |||
+ | <code PowerShell> | ||
+ | IPFS\ipfs-web> | ||
+ | IPFS\ipfs-web> | ||
+ | </ | ||
<code JavaScript> | <code JavaScript> | ||
- | import React, { BaseSyntheticEvent, | + | import React, { useState, useEffect } from 'react'; |
- | import * as IPFS from ' | + | import type { IPFS } from ' |
+ | import * as IPFSCore | ||
+ | |||
+ | let ipfs: IPFS; | ||
function IPFSUploader() { | function IPFSUploader() { | ||
- | const [node, setNode] = useState<any>(null); | + | const [isIpfsReady, setIpfsReady] = useState(Boolean(ipfs)) |
+ | const [version, setVersion] = useState("" | ||
+ | const [cid, setCID] = useState("" | ||
useEffect(() => { | useEffect(() => { | ||
- | | + | |
- | console.log(" | + | return function cleanup |
- | let _node = await IPFS.create({ silent: true }); | + | |
- | setNode(_node); | + | |
- | }; | + | ipfs.stop().catch((err: any) => console.error(err)); |
- | if(!node){ | + | // |
- | console.log(" | + | |
- | | + | |
} | } | ||
}, []); | }, []); | ||
- | | + | |
- | console.log(" | + | |
- | const node = await IPFS.create({ silent: true }); | + | |
- | const version | + | /* |
- | const { cid } = await node.add('hello world! world is fun!!!' | + | } else if (window.ipfs && window.ipfs.enable) { |
- | | + | console.log(' |
- | | + | ipfs = await window.ipfs.enable({ commands: [' |
- | const stream | + | */ |
- | let result | + | } else { |
- | for await (const chunk of stream) { | + | ipfs = await IPFSCore.create(); |
- | | + | |
- | } | + | |
- | console.info(result); | + | |
- | }; | + | } |
+ | setIpfsReady(Boolean(ipfs)); | ||
+ | }; | ||
+ | const fileSelected | ||
+ | if(!isIpfsReady) return; | ||
+ | |||
+ | const targetFile | ||
+ | if(targetFile){ | ||
+ | const _result | ||
+ | // | ||
+ | | ||
+ | } | ||
+ | | ||
- | const fileSelected = (event: BaseSyntheticEvent) => { | ||
- | console.log(" | ||
- | console.log(event); | ||
- | console.log(event.target.files); | ||
- | }; | ||
return ( | return ( | ||
<div> | <div> | ||
- | <button onClick={initializeIPFS}>Initialize | + | <h1> |
- | <input id=" | + | < |
+ | <input id=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </div> | ||
</ | </ | ||
); | ); | ||
行 66: | 行 97: | ||
export default IPFSUploader; | export default IPFSUploader; | ||
</ | </ | ||
+ | |||
+ | ===== App.tsx に IPFSUploader を追加 ===== | ||
+ | |||
+ | <code PowerShell> | ||
+ | IPFS\ipfs-web> | ||
+ | </ | ||
+ | |||
+ | 不要な記述を削除し、IPFSUploader コンポーネントを追加します。 | ||
+ | |||
+ | <code JavaScript> | ||
+ | import React from ' | ||
+ | import ' | ||
+ | import IPFSUploader from ' | ||
+ | |||
+ | function App() { | ||
+ | return ( | ||
+ | <div className=" | ||
+ | <header className=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | ); | ||
+ | } | ||
+ | |||
+ | export default App; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 実行 ===== | ||
+ | |||
+ | <code PowerShell> | ||
+ | IPFS\ipfs-web> | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== IPFSDirectoryUploader ===== | ||
+ | |||
+ | MFS を利用してファイルをアップロードする。 | ||
+ | <code PowerShell> | ||
+ | IPFS\ipfs-web> | ||
+ | </ | ||
+ | |||
+ | <code JavaScript> | ||
+ | import React, { useState, useEffect } from ' | ||
+ | import type { IPFS } from ' | ||
+ | import * as IPFSCore from ' | ||
+ | import { MFSEntry } from ' | ||
+ | |||
+ | let ipfs: IPFS; | ||
+ | |||
+ | function IPFSDirectoryUploader() { | ||
+ | const [isIpfsReady, | ||
+ | const [version, setVersion] = useState("" | ||
+ | const [MFSEntlies, | ||
+ | |||
+ | useEffect(() => { | ||
+ | startIpfs(); | ||
+ | return function cleanup () { | ||
+ | if (ipfs && ipfs.stop) { | ||
+ | console.log(' | ||
+ | ipfs.stop().catch((err: | ||
+ | //ipfs = undefined; | ||
+ | setIpfsReady(false); | ||
+ | } | ||
+ | } | ||
+ | }, []); | ||
+ | |||
+ | const startIpfs = async () => { | ||
+ | if(ipfs){ | ||
+ | console.log(' | ||
+ | /* | ||
+ | } else if (window.ipfs && window.ipfs.enable) { | ||
+ | console.log(' | ||
+ | ipfs = await window.ipfs.enable({ commands: [' | ||
+ | */ | ||
+ | } else { | ||
+ | ipfs = await IPFSCore.create(); | ||
+ | console.log(" | ||
+ | const _version = await ipfs.version(); | ||
+ | setVersion(_version.version); | ||
+ | |||
+ | const lsResult = await ipfs.files.ls("/" | ||
+ | let uploadDirectoryExist = false; | ||
+ | for await (const file of lsResult){ | ||
+ | if(file.name === " | ||
+ | console.log("/ | ||
+ | uploadDirectoryExist = true; | ||
+ | } | ||
+ | } | ||
+ | if(!uploadDirectoryExist){ | ||
+ | console.log(" | ||
+ | await ipfs.files.mkdir("/ | ||
+ | } | ||
+ | } | ||
+ | setIpfsReady(Boolean(ipfs)); | ||
+ | }; | ||
+ | const fileSelected = async (event: React.ChangeEvent< | ||
+ | if(!isIpfsReady) return; | ||
+ | |||
+ | const targetFile = event.target.files? | ||
+ | if(targetFile){ | ||
+ | const fileReader = new window.FileReader(); | ||
+ | fileReader.readAsArrayBuffer(targetFile); | ||
+ | fileReader.onloadend = async () => { | ||
+ | let ab = fileReader.result as ArrayBuffer; | ||
+ | const u8a = new Uint8Array(ab); | ||
+ | console.log(`upload / | ||
+ | await ipfs.files.write(`/ | ||
+ | await ls("/ | ||
+ | }; | ||
+ | } | ||
+ | }; | ||
+ | const ls = async (path: string) => { | ||
+ | const lsResult = await ipfs.files.ls(path); | ||
+ | for await (const file of lsResult){ | ||
+ | console.log(`${file.name}: | ||
+ | } | ||
+ | }; | ||
+ | const MFSStat = async () => { | ||
+ | if(!isIpfsReady) return; | ||
+ | |||
+ | const lsResult = await ipfs.files.ls('/ | ||
+ | let _mfs_entlies: | ||
+ | for await (const file of lsResult){ | ||
+ | console.log(`${file.name}: | ||
+ | _mfs_entlies.push(file); | ||
+ | } | ||
+ | setMFSEntlies(_mfs_entlies); | ||
+ | }; | ||
+ | |||
+ | return ( | ||
+ | <div> | ||
+ | < | ||
+ | < | ||
+ | <input id=" | ||
+ | <div> | ||
+ | < | ||
+ | <p> | ||
+ | { MFSEntlies? | ||
+ | <div> | ||
+ | < | ||
+ | <p> | ||
+ | <a href={`https:// | ||
+ | <img src={`https:// | ||
+ | </p> | ||
+ | </ | ||
+ | ))} | ||
+ | </p> | ||
+ | </ | ||
+ | </ | ||
+ | ); | ||
+ | } | ||
+ | |||
+ | export default IPFSDirectoryUploader; | ||
+ | </ | ||
+ | |||
+ | App.tsx に IPFSDirectoryUploader コンポーネントを記述する。 |
blockchain/dappsからipfsにファイルをアップロードする.1654591380.txt.gz · 最終更新: 2022/06/07 08:43 by dot