Цикл 4: выгрузка multipart / form-data методом POST - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю в Loopback 4 и зацикливаюсь на создании метода POST, чтобы клиент мог вызвать этот метод и загрузить multipart / form-data. Я прочитал несколько примеров:

Но, похоже, они не подходят для Loopback 4.

Не могли бы вы помочь мне загрузить multipart / form-data с помощью метода POST в Loopback4.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Поддержка multipart/form-data была недавно добавлена ​​в LoopBack 4 через https://github.com/strongloop/loopback-next/pull/1936.

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

В приведенных ниже примерах я настраиваю multer на использование памяти. Это, вероятно, не то, что вы хотите делать в производственной среде, пожалуйста, обратитесь к документации multer , чтобы узнать, как настроить другой сервер хранения.

Также обратите внимание, что вы также можете использовать multer в TypeScript, просто установите и добавьте @types/multer в devDependencies.

1. Обрабатывать загрузку файлов в вашем контроллере методом

Вы можете указать LoopBack пропустить синтаксический анализ тела и передать полный запрос методу контроллера. В методе контроллера вызовите multer для обработки загрузки файла. Полный рабочий пример можно найти в file-upload.acceptance.ts , я кросс-публикация реализации контроллера здесь.

class FileUploadController {
  @post('/show-body', {
    responses: {
      200: {
        content: {
          'application/json': {
            schema: {
              type: 'object',
            },
          },
        },
        description: '',
      },
    },
  })
  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) return reject(err);
        resolve({
          files: request.files,
          fields: (request as any).fields,
        });
      });
    });
  }
}

2. Зарегистрировать пользовательский LB4 BodyParser

В качестве альтернативы, вы можете перенести синтаксический анализ запросов на загрузку файлов в специализированный синтаксический анализатор и, таким образом, упростить методы контроллера для получения проанализированного результата. Это особенно полезно, когда у вас есть более одного метода контроллера, принимающего загрузку файлов.

Полный рабочий пример можно найти в file-upload-with-parser.acceptance.ts , я публикую здесь соответствующие фрагменты.

Парсер:

class MultipartFormDataBodyParser implements BodyParser {
  name = FORM_DATA;

  supports(mediaType: string) {
    // The mediaType can be
    // `multipart/form-data; boundary=--------------------------979177593423179356726653`
    return mediaType.startsWith(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) return reject(err);
        resolve({
          value: {
            files: request.files,
            fields: (request as any).fields,
          },
        });
      });
    });
  }
}

Регистрация парсера в конструкторе вашего приложения:

app.bodyParser(MultipartFormDataBodyParser);

И, наконец, контроллер:

class FileUploadController {
  @post('/show-body', {
    responses: {
      200: {
        content: {
          'application/json': {
            schema: {
              type: 'object',
            },
          },
        },
        description: '',
      },
    },
  })
  async showBody(
    @requestBody({
      description: 'multipart/form-data value.',
      required: true,
      content: {
        [FORM_DATA]: {
          schema: {type: 'object'},
        },
      },
    })
    body: unknown,
  ) {
    return body;
  }
}
0 голосов
/ 01 ноября 2018

Команда Loopback 4 реализует эту функцию: https://github.com/strongloop/loopback-next/pull/1880

Надеюсь, у нас это скоро будет.

...