Hyperledger composer文档附件支持

时间:2019-02-21 13:03:02

标签: hyperledger-fabric hyperledger-composer

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

对于IPFS,我建议您遵循link

在成功上传文件后,IPFS将为您提供一个Hash链接。您可以哈希存储到资产中,或参与超级账本编辑器的创建。

我希望它会对您有所帮助:)

答案 2 :(得分:0)

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

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 };