Проблема с прикреплением файла к электронной почте MS Graph в Angular 9

#angular #graph #base64 #email-attachments

#angular #График #base64 #электронная почта-вложения

Вопрос:

Я добавляю функциональность вложения файлов в веб-приложение Angular 9, но столкнулся с проблемой.

В ссылке MS Graph API говорится, что любой файл должен быть закодирован на основе 64 перед использованием, и я сделал это, но я получаю следующую ошибку

{«ошибка»:{«код»:»RequestBodyRead»,»сообщение»:»Не удается преобразовать литерал «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" Если я удалю это из строки base64, я смогу отправить электронное письмо самому себе.

Итак, вопрос в том, почему там находится эта первая часть строки и как мне удалить ее, если возвращаемое значение из getBase64 имеет неизвестный тип?

Ответ №1:

У вас может быть отдельная функция для получения кодировки файла base64 с помощью promises, затем используйте функцию разделения, чтобы удалить эту первую часть.

 <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)
}