hyperledger composer是否支持文档(.doc,PDF或图像)附件?基本上,我想在模型文件中添加文档作为资产的属性。我是初学者,任何建议都将不胜感激!
建议不要将大量文件放入区块链中。因此,您可以将其存储在某处并将链接存储到一个路径变量。为了确保文件不被更改,您可以在将文件存储到某处时散列文件的内容,并在检索时检查哈希。如果您需要将区块链中的文件存储为必需,您可以将文件编码为base64(推荐)字符串并对其进行解码以再次获取文件。
您可以将文件数据存储到IPFS
中。 IPFS是一种协议和网络,旨在创建一种内容可寻址的点对点方法,用于在distributed file
系统中存储和共享超媒体。
对于IPFS,我建议您关注link。
成功上传文件后,IPFS将为您提供Hash
链接。您可以将该哈希值存储到资源中,也可以参与hyperledger composer。
我希望它能帮到你:)
让我们假设您的意思是PDF文件。还有一个名为Invoice的简单资产
Asset Invoice identified by id {
o String id
o String pdfLocation
o String pdfHash
}
现在你可以在技术上定义一个数组并将pdf存储为字符串,但如上所述,这不是一个好习惯。相反,在我的一个PoC中,我实现了如下解决方案。
Invoice
资产,并且它想要附上实际发票的pdf副本multer
来解析PDF。这将返回req.file
中的信息,然后使用express
处理该信息并存储在mongoDB
中mongoDB
中,它只能通过对服务器的直接API调用来访问。无论您想要应用哪种ACL,都可以在中间件中进行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 };