2020-11-30 16:14:43
IPFS是分布式存储技术的瑞士军刀。它的用途和好处很多,并且已经被其他博客文章所涵盖。
IPFS是分布式存储技术的瑞士军刀。它的用途和好处很多,并且已经被其他博客文章所涵盖。因此,我不会在这里重新散列任何内容(双关语意)。
IPFS的一个常见用例是,客户端应用程序将文件(图像,文档,视频,json等)形式的数据上传和“固定”到网络,并获取可在其他地方引用的数据的哈希值在IPFS网络上。固定是一种告诉IPFS节点固定的数据很重要的方式,在执行垃圾回收时不应将其从IPFS节点中删除。您只能将数据固定到您控制的节点。因此,如果您有想要永久保留的内容,则必须启动并维护自己的IPFS节点,或者使用固定服务。
我们经常听到用户希望从他们的各种存储系统(在本例中为S3)中流式传输和固定大文件,而不必先将整个文件下载到他们的文件系统中的愿望。
以下示例将说明如何使用Node.js将文件从S3流传输到多个端点,而不必将文件写入磁盘。
假设条件
•您熟悉Node.js和NPM
•您有一个可以通过编程访问S3的AWS账户
步骤1 —将测试文件上传到S3
将测试文件上传到S3存储桶并跟踪密钥。
步骤2 —设置IPFS节点
为了固定数据,您需要设置和管理自己的IPFS节点。有现有的教程这一步,所以我不会在这里介绍这一进程。
步骤3 —设置一个简单的Node.js项目
在本地计算机上,使用简单的index.js文件设置一个Node.js项目,并准备从命令行运行它。
步骤4 —从S3获取可读的流
在这里,我们使用AWS S3 SDK从S3获取对象和可读流。您需要使用自己的AWS账户信息(包括s3AccessKeyId,s3AccessSecret,s3Region和s3Bucket)填写S3的变量。
步骤5a-将文件添加到您自己的IPFS节点
使用来自S3的流将文件添加到IPFS并获取哈希。下面是此示例的完整代码。
步骤5b —使用Pinata而不是自己的节点
您绝对可以托管,维护,保护,修补,升级和联网自己的IPFS节点。您也可以进行自己的牙科手术。这两种DIY方法都可能非常痛苦。相反,您可以使用Pinata作为将文件流式传输到IPFS的简便方法。以下示例显示了该方法的工作原理。
const ipfsClient = require ('ipfs-http-client' );
const AWS = require ('aws-sdk' );
const fileName = “ <您的文件名>” ;
const s3AccessKeyId = '<您的访问密钥>' ;
const s3AccessSecret = '<我们的秘密>' ;
const s3Region = '<您的区域>' ;
const s3Bucket = '' ;
s3 = 新的 AWS 。S3 ({
凭据:{
accessKeyId:s3AccessKeyId ,
secretAccessKey:s3AccessSecret ,
地区:s3Region
}
} );
让 s3Stream = s3 。getObject ({
值区:s3Bucket ,
密钥:fileName
} )。createReadStream ();
const tempIPFS = ipfsClient ({
主机:'localhost' ,
港口:5001 ,
协议:“ http”
} );
tempIPFS 。添加({
内容:s3Stream
} , {
cidVersion:1
} )。然后((res ) => {
控制台。日志(res );
} )。抓((e ) => {
控制台。错误(e );
} );
假设条件
•您喜欢让生活变得轻松
•您有一个Pinata帐户
•您不需要自己的IPFS节点,因此跳过上面的步骤2
在此示例中,我们将使用表单数据库创建一个多部分表单,以将我们从S3获得的可读流上载到Pinata API。我们使用Axios来处理http POST,因此您还将创建一个config对象,该对象指定文件上传的详细信息。
var axios = require ('axios' );
var FormData = require ('form-data' );
var form = new FormData ();
const AWS = require ('aws-sdk' );
const fileName = “ <您的文件名>” ;
const s3AccessKeyId = '<您的访问密钥>' ;
const s3AccessSecret = '<我们的秘密>' ;
const s3Region = '<您的区域>' ;
const s3Bucket = '' ;
const url = 'https://api.pinata.cloud/pinning/pinFileToIPFS' ;
const apiKey = '<你的pinata_api_key>' ;
const apiSecret = '' ;
s3 = 新的 AWS 。S3 ({
凭据:{
accessKeyId:s3AccessKeyId ,
secretAccessKey:s3AccessSecret ,
地区:s3Region
}
} );
让 s3Stream = s3 。getObject ({
值区:s3Bucket ,
密钥:fileName
} )。createReadStream ();
形成。append ('file' , s3Stream , {
filename:fileName //必需,否则失败
} );
var config = {
方法:“发布” ,
url:url ,
'maxBodyLength' :无限,
标头:{
'pinata_api_key':apiKey ,
'pinata_secret_api_key':apiSecret ,
...表格。getHeaders ()
} ,
数据:表格
} ;
axios (配置)
。然后(function (response ) {
控制台。日志(JSON 。字符串化(响应。数据));
} )
。catch (函数 (错误) {
控制台。日志(错误);
} );
注意几个重要的细节:
•首先,在form.append调用上的文件名。这是必要的,因为与直接从文件获取流不同,从S3流传输文件时不会自动提供文件名。从S3流式传输时,这可能是一个棘手的细节。
•还要注意,Axios请求上的maxBodyLength值设置为Infinity,否则Axios将在较大的文件上出错。
•您需要在请求的标题中提供您的pinata_api_key和pinata_secret_api_key。没有这些吗?
•最后,看看来自Pinata API的json响应数据,为您提供文件哈希(部分编辑),引脚大小和时间戳。
{
“ IpfsHash ”: “ QmPSEGPLVNnaE3GinhGXSefB2nJf9 ........ ”,
“ PinSize ”: 124584769,
“时间戳”: “ 2020-11-11T17:05:20.983Z ”
}
总结
通过此示例,您应该能够将文件从S3流传输到您自己的IPFS节点或Pinata API,而不必将所有文件数据持久存储在服务器上。因此,您可以提高应用程序的可伸缩性。