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;
}
}