在 Angular 9 中将附加文件发送到 MS Graph 电子邮件

Issue attaching file to MS Graph email in Angular 9

我正在向 Angular 9 网络应用程序添加文件附件功能,但 运行 遇到了问题。

MS Graph API 参考资料指出,任何文件在使用前都应进行 based64 编码,我已经这样做了,但出现以下错误

{"error":{"code":"RequestBodyRead","message":"无法将文字 'data:application/pdf;base64,JV.....' 转换为预期类型 'Edm.Binary'。"}}

这是我的代码;

  getBase64(file: File) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => resolve(reader.result);
      reader.onerror = error => reject(error);
    });
  }

async sendEmail(toEmail: string, subject: string, message: string, fileAttachment: File): Promise<any> {

    this.getBase64(fileAttachment).then(
      async data => {
        // console.log(data)

        try {
          const sendMail = {
            message: {
              subject: subject,
              body: {
                contentType: 'HTML',
                content: message
              },
              toRecipients: [
                {
                  emailAddress: {
                    address: toEmail
                  }
                }
              ],
              attachments: [
                {
                  "@odata.type": "#microsoft.graph.fileAttachment",
                  "name": fileAttachment.name,
                  "contentType": fileAttachment.type.toString,
                  "contentBytes": data
                }
              ]
            }
          };

          let res = await this.client.api('/me/sendMail').post(sendMail);

          return res;
        } catch (error) {
          this.handleError(error);
        }
      }
    );
  }

如果有人能提供帮助,我将不胜感激。我已经为此工作了一段时间,但未能解决问题。

非常感谢,

马克.

更新 使用 MS Graph Explorer 发送电子邮件,我能够确定问题的原因;这是来自 getBase64 "data:application/pdf;base64" 的 returned 值的第一部分 如果我从 base64 字符串中删除它,我可以给自己发送一封电子邮件。

所以问题是,为什么字符串的第一部分在那里?当来自 getBase64 的 return 值是未知类型时,我该如何去除它?

你可以有一个单独的函数来使用 promises 获取文件的 base64 编码,然后使用 split 函数删除第一部分。

<input name="attachments" type="file" (change)="addattachment($event)" >

function getBase64(file, onLoadCallback) {
    return new Promise(function(resolve, reject) {
        var reader = new FileReader();
        reader.onload = function() { resolve(reader.result); };
        reader.onerror = reject;
        reader.readAsDataURL(file);
    });
}

async addattachment (event) {
    const myfile = event.target.files[0]
    const promise = this.getBase64(myfile)
    const base64file = await promise
    var ms_base64file = base64file.split(',')[1]
    console.log(ms_base64file)
}