账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    react+ipfs实现文件上传下载
    19
    0

    最近在使用js上传文件到ipfs上,于是按照教程,自己在本地搭建了一个ipfs节点,上传文件端口是5001,查看文件端口是8080,但是代码写完之后,在自己本机节点测试,上传文件功能实现,使用本机测试节点http://127.0.0.1:8080/ipfs/:hash可以访问到该文件,但是在https://ipfs.io/ipfs/:hash下经常访问不到(有时可以访问到,但是不是立刻,有时间间隔),因此怀疑自己是不是被墙了,但是vpn正常,像一个之后1-2k的txt文件需要很久才能读取到。

    问:
    1.这个ipfs上传文件是不是需要很久才能查看,如何查看上传进度。
    2.下载下来的文件是一个无格式的文件,如何实现上传的文件格式即为下载的文件格式。

    代码如下:

    import React, {Component} from 'react';
    import './App.css';
    
    const ipfsAPI = require('ipfs-api');
    const ipfs = ipfsAPI({host: 'localhost', port: '5001', protocol: 'http'});
    // hash = 'QmdkpWSqP1eCMyY5epNLzqdp1M16nUYM2CkxwZPZy3vQHc';
    // 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,
          imgSrc: 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);
          })
        })
      }
    
      saveImageOnIpfs = (reader) => {
        return new Promise(function(resolve, reject) {
          const buffer = Buffer.from(reader.result);
          ipfs.add(buffer).then((response) => {
            console.log(response)
            resolve(response[0].hash);
          }).catch((err) => {
            console.error(err)
            reject(err);
          })
        })
      }
    
    
      render() {
        return (<div>
          <input type="file" ref="file" id="file" name="file" multiple="multiple"/>
          <br/>
          <input ref="ipfsContent"/>
          <button onClick={() => {
              var file = this.refs.file.files[0];
              var reader = new FileReader();
              // reader.readAsDataURL(file);
              reader.readAsArrayBuffer(file)
              reader.onloadend = (e) => {
                console.log(reader);
                // 上传数据到IPFS
                this.saveImageOnIpfs(reader).then((hash) => {
                  console.log(hash);
                  this.setState({
                    imgSrc: hash,
                    strHash: hash
                  })
                });
              }
    
              // let ipfsContent = this.refs.ipfsContent.value;
              // console.log(ipfsContent);
              // this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {
              //   console.log(hash);
              //   this.setState({strHash: hash});
              // });
            }}>提交到IPFS</button>
          <p>http://ipfs.io/ipfs/{this.state.strHash}</p>
          <button onClick={() => {
              console.log('从ipfs读取数据。')
              let hash = this.state.strHash;
              
              ipfs.cat(hash).then((stream) => {
                console.log(stream);
                let strContent = Utf8ArrayToStr(stream);
                console.log(strContent);
                this.setState({strContent: strContent});
              });
            }}>读取数据</button>
          <h1>{"https://ipfs.io/ipfs/" + this.state.imgSrc}</h1>
          <img alt="区块链部落"  src={"http://127.0.0.1:8080/ipfs/" + this.state.imgSrc}/>
          </div>);
      }
    }
    
    export default App;
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 我们再无交集 普通会员 1楼

      在React中,我们可以使用IPFS的API来实现文件的上传和下载。以下是一个简单的示例:

      首先,你需要安装ipfs的依赖项。你可以使用npm来安装:

      bash npm install ipfs @ipfs/core @ipfs/v0.27.1

      然后,你可以创建一个文件并将文件内容存储到IPFS。这可以通过以下方式完成:

      ```javascript import IPFS from "@ipfs/core"; import fs from "fs";

      const ipfs = new IPFS();

      const filePath = "/path/to/your/file.txt";

      fs.writeFileSync(filePath, "Hello, World!");

      ipfs.add(filePath); ```

      这将创建一个文件的哈希,并将该文件内容添加到IPFS中。

      接下来,你可以使用IPFS的API来获取文件的内容。这可以通过以下方式完成:

      ```javascript const filePath = "/path/to/your/file.txt";

      const result = await ipfs.get(filePath);

      console.log(result); ```

      这将返回文件的内容。

      如果你想将文件的内容下载到本地,你可以使用IPFS的API来下载文件。这可以通过以下方式完成:

      ```javascript const filePath = "/path/to/your/file.txt";

      const result = await ipfs.get(filePath);

      const blob = result.getBlob();

      const response = await fetch(blob.url);

      const blobData = await response.blob();

      const blobURL = response.url;

      fs.writeFileSync(blobURL, blobData); ```

      这将下载文件的内容到本地,并将其保存为一个新的文件。

      注意,这只是一个基本的示例。在实际应用中,你可能需要处理更多的错误和细节。

    更多回答
    扫一扫访问手机版