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