如何在钩子中保存LoopBack中的base64编码文件

时间:2018-02-26 14:57:15

标签: node.js file-upload base64 loopbackjs loopback

我试图找到一种方法将文件保存在以base64编码字符串形式发送的环回应用程序中。

所以我有一个包含所有可能字段的模型以及base64编码图像,“收据”。

{
  ...modelData,
  "receipt": "datadata:image/jpeg;base64,whatever=="
}

所以......我想到的是这个

Model.beforeRemote('create', function(ctx, model, next) {
  const file = ctx.args.data.receipt;
  app.models.Attachment.upload(...)
  // and replace base64 with returned filename
})

但我不清楚我应该如何以及如何传递给上传方法。或许它必须是一些不同的方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

这不是一个远程钩子,而是一个远程方法,但我相信你可以根据自己的需要调整代码。

我们基本上创建了一个名为" upload"的远程方法。对于Documents模型,它负责将其上传到预定义的容器名称。

const CONTAINERS_URL = '/api/container/';
const fs = require('fs');
const path = require('path');
const encodedFileContainer = 'files';

module.exports = function(Document) {
  Document.upload = function(encodedFile, fileName, cb) {
    let uploadStream = Document.app.models.container.uploadStream(
      encodedFileContainer,
      fileName
    );
    uploadStream.end(encodedFile, 'base64', async err => {
      if (err) return cb(err);
      let newRecord = await Document.create(
        {
          fileName,
          url: CONTAINERS_URL + encodedFileContainer + '/download/' + fileName,
          container: encodedFileContainer
        },
        function(err, obj) {
          if (err !== null) {
            cb(err);
          } else {
            cb(null, obj);
          }
        }
      );
    });
  };
  Document.remoteMethod('upload', {
    description: 'Uploads a file',
    accepts: [
      {
        arg: 'endcodedFile',
        type: 'string',
        required: true,
        description: 'base64 encoded file',
        http: {source: 'form'}
      },
      {
        arg: 'fileName',
        type: 'string',
        required: true,
        description: 'file name',
        http: {source: 'form'}
      }
    ],
    returns: {
      arg: 'fileObject',
      type: 'object',
      root: true
    },
    http: {verb: 'post'}
  });