gpt4 book ai didi

loopbackjs - 环回 4 : Upload multipart/form-data via POST method

转载 作者:行者123 更新时间:2023-12-01 08:22:11 25 4
gpt4 key购买 nike

我正在使用 Loopback 4 并陷入创建 POST 方法,以便客户端可以调用此方法并上传 multipart/form-data。
我读了一些例子:

  • https://medium.com/@jackrobertscott/upload-files-to-aws-s3-in-loopback-29a3f01119f4
  • https://github.com/strongloop/loopback-example-storage

  • 但是,看起来它们不适合 Loopback 4。

    你能帮我通过 Loopback4 中的 POST 方法上传多部分/表单数据吗?

    最佳答案

    支持multipart/form-data最近通过 https://github.com/strongloop/loopback-next/pull/1936 添加到 LoopBack 4 .

    由于处理上传文件的方式有很多种,LoopBack 4 没有提供开箱即用的通用文件上传解决方案。相反,它允许应用程序实现自己的文件上传处理程序。

    在下面的示例中,我正在配置 multer使用内存存储。这可能不是您在生产中想要做的,请引用 multer文档以了解如何配置不同的存储后端。

    另请注意,您可以使用 multer在 TypeScript 中,只需安装并添加 @types/multer给您的devDependencies .

    1.在 Controller 方法中处理文件上传

    您可以告诉 LoopBack 跳过正文解析并将完整请求传递给您的 Controller 方法。在 Controller 方法中,调用multer处理文件上传。完整的工作示例可以在 file-upload.acceptance.ts 中找到。 ,我在这里交叉发布 Controller 实现。

    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

    或者,您可以将文件上传请求的解析移至专门的正文解析器,从而简化您的 Controller 方法以接收解析结果。当您有多个 Controller 方法接受文件上传时,这尤其有用。

    完整的工作示例可以在 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);

    最后是 Controller :

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

    关于loopbackjs - 环回 4 : Upload multipart/form-data via POST method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53102928/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com