如何将文件从AWS S3流传输到IPFS

2020-11-30 16:14:43

IPFS是分布式存储技术的瑞士军刀。它的用途和好处很多,并且已经被其他博客文章所涵盖。

  IPFS是分布式存储技术的瑞士军刀。它的用途和好处很多,并且已经被其他博客文章所涵盖。因此,我不会在这里重新散列任何内容(双关语意)。

如何将文件从AWS S3流传输到IPFS

  IPFS的一个常见用例是,客户端应用程序将文件(图像,文档,视频,json等)形式的数据上传和“固定”到网络,并获取可在其他地方引用的数据的哈希值在IPFS网络上。固定是一种告诉IPFS节点固定的数据很重要的方式,在执行垃圾回收时不应将其从IPFS节点中删除。您只能将数据固定到您控制的节点。因此,如果您有想要永久保留的内容,则必须启动并维护自己的IPFS节点,或者使用固定服务。

  我们经常听到用户希望从他们的各种存储系统(在本例中为S3)中流式传输和固定大文件,而不必先将整个文件下载到他们的文件系统中的愿望。

  以下示例将说明如何使用Node.js将文件从S3流传输到多个端点,而不必将文件写入磁盘。


  假设条件

  •您熟悉Node.js和NPM

  •您有一个可以通过编程访问S3的AWS账户


  步骤1 —将测试文件上传到S3

  将测试文件上传到S3存储桶并跟踪密钥。


将测试文件上传到S3存储桶并跟踪密钥


  步骤2 —设置IPFS节点

  为了固定数据,您需要设置和管理自己的IPFS节点。有现有的教程这一步,所以我不会在这里介绍这一进程。


  步骤3 —设置一个简单的Node.js项目

  在本地计算机上,使用简单的index.js文件设置一个Node.js项目,并准备从命令行运行它。


  步骤4 —从S3获取可读的流

  在这里,我们使用AWS S3 SDK从S3获取对象和可读流。您需要使用自己的AWS账户信息(包括s3AccessKeyIds3AccessSecrets3Regions3Bucket)填写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_keypinata_secret_api_key。没有这些吗?

  •最后,看看来自Pinata API的json响应数据,为您提供文件哈希(部分编辑),引脚大小和时间戳。

  {

  “ IpfsHash ”: “ QmPSEGPLVNnaE3GinhGXSefB2nJf9 ........ ”,

  “ PinSize ”: 124584769,

  “时间戳”: “ 2020-11-11T17:05:20.983Z ”

  }


  总结

  通过此示例,您应该能够将文件从S3流传输到您自己的IPFS节点或Pinata API,而不必将所有文件数据持久存储在服务器上。因此,您可以提高应用程序的可伸缩性。


最新推荐