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);
});
}
});
我正在尝试通过 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);
});
}
});