最近在使用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;
在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); ```
这将下载文件的内容到本地,并将其保存为一个新的文件。
注意,这只是一个基本的示例。在实际应用中,你可能需要处理更多的错误和细节。