Loopback4 Загрузка файла Пример компонента хранения - PullRequest
1 голос
/ 17 марта 2019

Я ищу пример для хранилища файлов с использованием loopback4, может кто-нибудь предоставить конфигурацию контроллера для операций с файлом crud?

1 Ответ

3 голосов
/ 25 марта 2019

LoopBack 4 не предоставляет встроенного синтаксического анализатора для многоэтапных запросов на загрузку файлов.Вместо этого мы предоставляем точки расширения, позволяющие приложениям использовать сторонние парсеры, такие как multer .

. Существует два варианта написания контроллера, принимающего загрузку файлов.Вы можете узнать больше об этой теме в наших документах, см. Разбор запросов и Расширение разбора тела запроса

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...