微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Twilio 对话媒体消息文件名未保存

如何解决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。 (旁注:将 fetchFormData 一起使用时,您的 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 举报,一经查实,本站将立刻删除。