Smooch - 从缓冲区创建附件

Smooch - create attachments from buffer

我正在尝试通过 smooch-core API

创建图像

我有一个图像 Buffer - base64,我尝试这样的操作:

smoochClient.attachments
            .create({
                appId: appId,
                props: {
                    for: 'message',
                    access: 'public',
                    appUserId: appUserId
                },
                source: myBuffer
            })
            .then(() => {
                console.log('OK');
            }).catch(err => {
            console.log(JSON.stringify(err));
        });

我收到此错误:"status":413,"statusText":"Payload Too Large"

[当我通过 Postman 正常创建此图像时,它运行良好,所以它不是太大 - 我猜这是因为 Buffer 的发送]

有谁知道我如何向这个 API 发送缓冲区?

是否可以直接在 postman 调用中提交 base64 数据?

通读规范 here 看起来 source 应该是 filepath/name,而不是原始二进制数据。

简单的方法可能是将 base64 数据保存到 [n 适当编码的] 文件,然后提供该文件的路径 source

否则我不确定我是否会拆开 api_instance.upload_attachment() 以输入 base64 数据而不是来自指定文件名的 opening/reading。

我找到了这样的解决方案:

创建一个临时文件以获取它的读取流并将其发送到源而不是 myBuffer 参数,这里是创建临时文件的代码:

 async getTempFileSource(bufferData) {
        const fs = require("fs");
        //remove mime type
        if (bufferData.startsWith('data:'))
            bufferData = bufferData.split('base64,')[1];
        //Get file extension
        const type = await require('file-type').fromBuffer(new Buffer(bufferData, 'base64'));
        if (!type) {
            console.log("getTempFileSource - The buffer data is corrupted", 'red');
            return null;
        }
        //create temporary file
        const tempFile = require('tmp').fileSync({postfix: '.' + type.ext});
        //append buffer data to temp file
        fs.appendFileSync(tempFile.name, new Buffer(bufferData, 'base64'));
        //create read stream from the temp file
        const source = fs.createReadStream(tempFile.name);
        //remove the temp file
        tempFile.removeCallback();
        return source;
    }

这是创建附件的代码:

 return new Promise(async (resolve, reject) => {
        const source = await getTempFileSource(bufferData);
        if (!source)
            resolve(null);
        else {
            session.smoochClient.attachments
                .create({
                    appId: appId,
                    props: {
                        for: 'message',
                        access: 'public',
                        appUserId: appUserId
                    },
                    source: source
                })
                .then(res => {
                    resolve(res);
                }).catch(err => {
                reject(err);
            });
        }
    });