如何解决Twilio 对话媒体消息文件名未保存
我正在使用 Twilio Converstaions API 来管理我的 Web 应用程序的应用内聊天。我允许用户加载带有消息的媒体(非常标准)。
Twilio 的文档建议先上传媒体,然后将媒体附加到对话中的特定消息。有道理。
上传媒体
curl -u “<account_sid>:<account_secret>” --data-binary “@<filename>” https://mcs.us1.twilio.com/v1/Services/<chat_service_sid>/Media
将媒体连接到消息
curl -u "<account_sid>:<account_secret>" -X POST https://conversations.twilio.com/v1/Conversations/<conversation_sid>/Messages -d MediaSid=<media_sid>
我能够上传媒体并将媒体连接到特定对话,但无论出于何种原因,我都无法将文件名与媒体一起保存。它总是只显示为空。这是我的代码的样子:
const createTwilioMediaMessage = async (
twilioConversation,twilIoUser,body,files,) => {
try {
const promises = [];
const url = `https://mcs.us1.twilio.com/v1/Services/my_hidden_id/Media`;
const successMediaSids = [];
const formData = new FormData();
formData.append('filename','test_file.png');
formData.append('media',fs.readFileSync(file.path));
files.forEach(async (file) => {
promises.push(
fetch(url,{
body: formData,method: 'POST',headers: {
Authorization: `Basic ${btoa(`${accountSid}:${authToken}`)}`,'Content-Type': 'application/x-www-form-urlencoded',},})
.then((res) => res.json())
.then((res) => {
successMediaSids.push(res.sid);
})
.catch(() => {}),);
});
await Promise.all(promises);
return Promise.all(
successMediaSids.map(async (sid,index) => {
await client.conversations
.conversations(twilioConversation.sid)
.messages.create({
author: twilIoUser.identity,body: index === 0 ? body : '',mediaSid: sid,});
}),);
} catch (err) {
console.log('err ',err);
}
};
我尝试使用 Content-Type: "multipart/form-data"
,但当时文件根本没有上传。
非常感谢任何建议!
解决方法
这里是 Twilio 开发者布道者。
当您将媒体上传到媒体端点时,您应该以二进制格式进行上传。这意味着您应该发送文件的字节作为请求的正文,并且 Content-Type
应该设置为您正在上传的媒体的内容类型。
我之前没有使用 node-fetch
完成此操作,但我相信它实际上应该比您的代码更简单,因为您不需要使用 FormData
。 (旁注:将 fetch
与 FormData
一起使用时,您的 Content-Type
会自动设置为 multipart/form-data
。)
尝试这样的事情:
const FileType = require("file-type");
const createTwilioMediaMessage = async (
twilioConversation,twilioUser,body,files
) => {
try {
const promises = [];
const url = `https://mcs.us1.twilio.com/v1/Services/my_hidden_id/Media`;
const successMediaSids = [];
files.forEach(async (file) => {
const buffer = fs.readFileSync(file.path);
promises.push(
fetch(url,{
body: buffer,method: "POST",headers: {
Authorization: `Basic ${btoa(`${accountSid}:${authToken}`)}`,"Content-Type": FileType.fromBuffer(buffer),},})
.then((res) => res.json())
.then((res) => {
successMediaSids.push(res.sid);
})
.catch(() => {})
);
});
await Promise.all(promises);
return Promise.all(
successMediaSids.map(async (sid,index) => {
await client.conversations
.conversations(twilioConversation.sid)
.messages.create({
author: twilioUser.identity,body: index === 0 ? body : "",mediaSid: sid,});
})
);
} catch (err) {
console.log("err ",err);
}
};
请注意,我们将从文件中读取的buffer
直接传递给fetch
,并通过使用the file-type
module读取缓冲区的文件类型来设置内容类型。
我意识到我已经写了所有这些,但它没有回答文件名问题。我可以向您保证,我正在 Twilio 内部检查此事,因为它似乎没有记录,我会在发现时更新您。
,因此,目前,如果我没记错的话,您只能上传文件名作为 FormData 一部分的媒体(例如,带有 Content-Disposition 标头的 multipart/form-data 有效负载。
我正在努力为使用 SendMediaOptions 进行发送添加相同的功能,敬请期待。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。