Hyperledger作曲家文档附件支持

问题描述 投票:0回答:3

hyperledger composer是否支持文档(.doc,PDF或图像)附件?基本上,我想在模型文件中添加文档作为资产的属性。我是初学者,任何建议都将不胜感激!

hyperledger-fabric hyperledger-composer
3个回答
0
投票

建议不要将大量文件放入区块链中。因此,您可以将其存储在某处并将链接存储到一个路径变量。为了确保文件不被更改,您可以在将文件存储到某处时散列文件的内容,并在检索时检查哈希。如果您需要将区块链中的文件存储为必需,您可以将文件编码为base64(推荐)字符串并对其进行解码以再次获取文件。


0
投票

您可以将文件数据存储到IPFS中。 IPFS是一种协议和网络,旨在创建一种内容可寻址的点对点方法,用于在distributed file系统中存储和共享超媒体。

对于IPFS,我建议您关注link

成功上传文件后,IPFS将为您提供Hash链接。您可以将该哈希值存储到资源中,也可以参与hyperledger composer。

我希望它能帮到你:)


0
投票

让我们假设您的意思是PDF文件。还有一个名为Invoice的简单资产

Asset Invoice identified by id {
  o String id
  o String pdfLocation
  o String pdfHash
}

现在你可以在技术上定义一个数组并将pdf存储为字符串,但如上所述,这不是一个好习惯。相反,在我的一个PoC中,我实现了如下解决方案。

  1. 第一步是用户创建一个新的Invoice资产,并且它想要附上实际发票的pdf副本
  2. 他发送带有详细信息的API调用,并使用multer来解析PDF。这将返回req.file中的信息,然后使用express处理该信息并存储在mongoDB
  3. 一旦文件存储在mongoDB中,它只能通过对服务器的直接API调用来访问。无论您想要应用哪种ACL,都可以在中间件中进行
  4. 存储文档后,mongoDB或任何其他数据库将返回主键。这存储在pdfLocation中。想要检索发票时,用户将首先获取Invoice资产,访问pdfLocation,然后通过引用主键从mongoDB本身查询文档

快速片段让您入门

const express = require('express');
const multer = require('multer');
const router = express.Router();
let storage = multer.memoryStorage();
let upload = multer({ storage: storage })

router.post('/invoice, upload.single('invoice-pdf'), createInvoice);

const createInvoice = async (req, res, next) => {
  // Do your usual stuff of connecting via businessNetworkConnection
  // Assume the file upload is a success

  let document = new documentSchema({
        originalName: req.file.originalname,
        file: req.file.buffer,
        creationDate: new Date()
       );
  let param = await document.save();
  primarykey = param._id;

  let newInvoice = factory.newResource(BASE_NS, 'Invoice', req.body.id);
  // Add whatever values you want
  newInvoice.pdfLocation = primaryKey;
  await registry.add(newInvoice);
}

文档架构是用于存储信息的简单集合。看起来像这样

const documentSchema = new Schema({
  originalName: {
    type: String,
    required: true,
    unique: true
  },
  file: {
    type: Buffer,
    required: true
  },
  creationDate: {
    type: String,
    required: true
  },
});

如果您使用不同的数据库,假设您可以执行类似的操作现在,用户希望从发票中检索相同的PDF文件。最终结果,他从前端调用了一个API,并给出了一个可以下载的PDF

router.get('/invoice/pdf', someSecretACL, getPdfFile);

const getPdfFile = async (req, res, next) => {
  // Connect to the business network, load the registry

  let invoice = await registry.get(req.body.id) // Get the invoice
  let primaryKey = invoice.pdfLocation;

  // Now get the bytes from mongoDB and send them to the browser
  let array = await documentSchema.find({ _id: id });
  let pdf = array[0] // assume successful call
  res.contentType("application/pdf");
  res.send(pdf .file);
};

const someSecretACL = async (req, res, next) => { // Do some checks here };
© www.soinside.com 2019 - 2024. All rights reserved.