Loopback4文件上传存储组件示例

问题描述 投票:1回答:1

我正在寻找使用loopback4的文件存储的示例,有人可以为文件crud操作提供控制器配置吗?

file upload components storage loopback
1个回答
3
投票

LoopBack 4不为多部分文件上载请求提供内置解析器。相反,我们提供扩展点,允许应用程序使用第三方解析器,如multer

如何编写接受文件上载的控制器有两种选择。您可以在我们的文档中了解有关此主题的更多信息,请参阅Parsing requestsExtending request body parsing

1.在控制器方法中处理文件上载

指示LoopBack将原始正文流传递给您的控制器方法。在控制器方法中,调用文件上载解析器来处理多部分流。

好处:不同的端点可能希望以不同方式处理上载的文件。通过在控制器方法中实现文件上载解析,可以轻松自定义此过程的所有方面。

交叉发布file-upload.acceptance.ts的示例:

import * as multer from 'multer';

class FileUploadController {
  @post('/show-body', {
    responses: {
      // (left out for brevity)
    },
  })
  async showBody(
    @requestBody({
      description: 'multipart/form-data value.',
      required: true,
      content: {
        'multipart/form-data': {
          // Skip body parsing
          'x-parser': 'stream',
          schema: {type: 'object'},
        },
      },
    })
    request: Request,
    @inject(RestBindings.Http.RESPONSE) response: Response,
  ): Promise<Object> {
    const storage = multer.memoryStorage();
    const upload = multer({storage});
    return new Promise<object>((resolve, reject) => {
      upload.any()(request, response, err => {
        if (err) reject(err);
        else {
          resolve({
            files: request.files,
            fields: (request as any).fields,
          });
        }
      });
    });
  }

2.实现并注册一个主体解析器,用于上传多部分文件

在此选项中,所有文件上传都以相同的方式在传输层处理,适用于所有控制器方法。控制器方法接收已解析的数据。

来自file-upload-with-parser.acceptance.ts的示例正文解析器实现:

class MultipartFormDataBodyParser implements BodyParser {
  name = 'multipart/form-data';

  supports(mediaType: string) {
    // The mediaType can be
    // `multipart/form-data; boundary=--------------------------979177593423179356726653`
    return mediaType.startsWith('multipart/form-data');
  }

  async parse(request: Request): Promise<RequestBody> {
    const storage = multer.memoryStorage();
    const upload = multer({storage});
    return new Promise<RequestBody>((resolve, reject) => {
      upload.any()(request, {} as any, err => {
        if (err) reject(err);
        else {
          resolve({
            value: {
              files: request.files,
              fields: (request as any).fields,
            },
          });
        }
      });
    });
  }
}

利用此主体解析器的示例控制器:

class FileUploadController {
  @post('/show-body', {
    responses: {
      // (left out for brevity)
    },
  })
  async showBody(
    @requestBody({
      description: 'multipart/form-data value.',
      required: true,
      content: {
        'multipart/form-data': {
          schema: {type: 'object'},
        },
      },
    })
    {files, fields}: any,
  ) {
    return body;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.