У меня есть одна странная проблема. Я создал API, который позволяет вам: загружать фотографии на сервер, затем сохранять данные в базу данных, создавать PDF-файл с этими данными и фотографиями, а затем отправлять электронное письмо с этим вложением в формате PDF. У меня это работало хорошо, пока я загружал/отправлял только две фотографии. Я смог открыть этот сгенерированный PDF-файл с помощью Finder, а также смог открыть его из полученного электронного письма.
Затем я загрузил больше файлов и после отправки запроса API получил электронное письмо с этим pdf-файлом, но не смог его открыть. Выдает ошибку, что Finder не смог открыть этот файл. Когда я проверил вручную внутри папки сервера, он работал хорошо.
Таким образом, должна быть проблема при отправке этого электронного письма. От 0 до 2 фото работает хорошо, больше 2 не работает. Но когда я открываю этот pdf-файл на сервере, он хорошо работает даже с 8 фотографиями.
Отправка изображения этого вложения в формате PDF.
Вот код, который я использую для создания pdf с картинками:
const photosToPdf = [];
let positionX = 30;
let positionY = 240;
for(let j=0;j<uploadsPath.length;j++){
photosToPdf.push(uploadsFileNames[j]);
}
photosToPdf.forEach(img => {
if (positionX == 570){
positionX = 30
positionY = positionY + 160
}
doc.image(`uploads/${img}`, positionX, positionY, {width: 80});
positionX = positionX + 90
});
А вот код, который генерирует электронную почту:
function highPriorityEmail(){
return new Promise((resolve, reject) => {
setTimeout(() => {
let filePath = path.join(__dirname, `../../${problemName}_${creationDate}.pdf`);
let attachment = fs.readFileSync(filePath).toString("base64");
let fileName = `${problemName}_${creationDate}.pdf`
if (problemPriority == "vysoká") {
global.msg = {
//to: ['[email protected]', '[email protected]'], // Change to your recipient
//to: "[email protected]", // Change to your recipient
to: "[email protected]", // Change to your recipient
from: "[email protected]", // Change to your verified sender
subject: "Vytvorenie nového nedostatku: " + problemName,
html: `
Dobrý deň, <br>
<br>
dňa ${creationDate} bol vykonaný dozor koordinátora ${koordinatorName}. <br>
Boli zistené nedostatky s vysokou prioritou, ktoré sú priložené v prílohe tohoto emailu.
<br>
`,
attachments: [
{
content: attachment,
filename: fileName,
contentType:'application/pdf'
},
],
};
// sgMail.sendMultiple(msg) to prevent seeing
sgMail
.send(msg)
.then(() => {
console.info("Email sent");
})
.catch((error) => {
console.error(error);
});
Case.update(
{ wasSended: 1 },
{ returning: true, where: { caseName: problemName } }
);
}
resolve();
}, 1000)
});
};
Я использую:
pdfkit-таблица
и sendgrid/почта
Спасибо за помощь
С 8 фотографиями он занимает 5,8 МБ.
Я не уверен, что происходит тогда. Не могли бы вы прислать мне пример в формате pdf на мою электронную почту [email protected], и я попытаюсь воспроизвести.
Я отправил вам два электронных письма, одно с 2 фотографиями, вы сможете его открыть, а второе с 8 фотографиями, и оно будет повреждено.
Чтобы воспроизвести, мне понадобится PDF-файл до того, как вы отправили его по электронной почте, с того момента, когда вы сможете его открыть. Можете ли вы сгенерировать PDF и отправить мне оригинал, пожалуйста?
Ой, извини. Я отправил вам только pdf с 8 фотографиями на ваш адрес электронной почты
Вы прислали мне сломанный PDF. Если проблема в том, когда он отправляется через API, мне нужен рабочий PDF-файл с 8 фотографиями.
Давайте продолжить обсуждение в чате.
Хорошо, я думаю, мы получили ответ здесь.
Проблема в строке
global.msg = {
Установка переменной, которая является локальной для функции, в качестве глобальной переменной, позволяет другому коду изменять эти данные во время их использования. Вместо этого измените это на const
, и вы избежите этой проблемы:
const msg = {
Еще одна вещь, на которую следует обратить внимание, но свойство типа содержимого объекта вложений должно быть type
, а не contentType
(хотя в моем тестировании это ничего не изменило).
attachments: [
{
content: attachment,
filename: fileName,
type:'application/pdf'
},
],
Насколько велик вложенный файл PDF, если у вас больше двух фотографий?