Вопрос или проблема
Я в настоящее время пытаюсь конвертировать различные файлы, такие как музыка, видео, изображения, и эти три работают нормально, но когда я пытаюсь конвертировать документы с использованием LibreOffice на моем сервере Express, некоторые из них успешно конвертируются, но если это не удается, эта ошибка всегда появляется.
Ошибка конвертации: ENOENT: нет такого файла или каталога, открыть 'C:\Users\ASUS\AppData\Local\Temp\libreofficeConvert_-27920-NNg4r8O5ucJU\source.fodt'
Например, html – doc, docx, rtf, ods, xlsx, xlscsv, odp, ppt, pptx, xml, epub, mml, fodt, эта ошибка появляется, а другие форматы, такие как pdf в другие форматы, показывают ту же ошибку.
Вот мой пример кода
const express = require("express");
const libre = require("libreoffice-convert");
const bodyParser = require("body-parser");
const multer = require("multer");
const path = require("path");
const fs = require("fs");
const app = express();
const port = 3000;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const tempDir = path.join(__dirname, "temp");
if (!fs.existsSync(tempDir)) {
fs.mkdirSync(tempDir);
}
process.env.TMPDIR = tempDir;
const upload = multer({ dest: "uploads/" });
const deleteFile = (filePath) => {
setTimeout(() => {
try {
fs.unlinkSync(filePath);
console.log(`Файл успешно удален: ${filePath}`);
} catch (err) {
console.error(`Ошибка при удалении файла ${filePath}:`, err);
}
}, 1000);
};
// Эндпоинт для конвертации документов
app.post("/convert-document", upload.single("file"), (req, res) => {
const inputPath = req.file.path;
const outputFormat = req.body.format || ".pdf";
const outputPath = path.join(
__dirname,
"uploads",
`${req.file.filename}${outputFormat}`,
);
console.log(`Начинаю конвертацию: ${inputPath} в ${outputPath}`);
console.log(`Временная директория: ${process.env.TMPDIR}`);
if (!fs.existsSync(inputPath)) {
console.error("Исходный файл не существует.");
return res.status(400).send("Исходный файл не существует.");
}
const file = fs.readFileSync(inputPath);
libre.convert(file, outputFormat, undefined, (err, done) => {
if (err) {
console.error(`Ошибка конвертации: ${err.message}`);
return res.status(500).send(`Ошибка конвертации: ${err.message}`);
}
console.log(`Конвертация успешна: ${inputPath} в ${outputPath}`);
fs.writeFileSync(outputPath, done);
res.download(outputPath, (err) => {
if (err) {
console.error("Ошибка при отправке файла:", err);
}
// Очистка входных и выходных файлов
deleteFile(inputPath);
deleteFile(outputPath);
});
});
});
app.listen(port, () => {
console.log(`Сервер работает на порту ${port}`);
});
Я уже добавил переменную окружения в путь
C:\Program Files\LibreOffice\program
Когда конвертация успешна в другом формате, этот лог появляется на моем сервере Express
0|конвертер-сервер | Начинаю конвертацию:
uploads\aa4a02556987e78d1a4583c88da78f49 в
C:\xampp\htdocs\ConverteVue\src\express-server\uploads\aa4a02556987e78d1a4583c88da78f49html
0|конвертер-сервер | Временная директория:
C:\xampp\htdocs\ConverteVue\src\express-server\temp 0|конвертер-сервер
| Конвертация успешна: uploads\aa4a02556987e78d1a4583c88da78f49 в
C:\xampp\htdocs\ConverteVue\src\express-server\uploads\aa4a02556987e78d1a4583c88da78f49html
0|конвертер-сервер | Файл успешно удален:
uploads\aa4a02556987e78d1a4583c88da78f49 0|конвертер-сервер | Файл
успешно удален:
C:\xampp\htdocs\ConverteVue\src\express-server\uploads\aa4a02556987e78d1a4583c88da78f49html
Если нет, то появляется это сообщение
0|конвертер-сервер | Начинаю конвертацию:
uploads\615178f63b74e3f349dae22eb184cd95 в
C:\xampp\htdocs\ConverteVue\src\express-server\uploads\615178f63b74e3f349dae22eb184cd95ods
0|конвертер-сервер | Временная директория:
C:\xampp\htdocs\ConverteVue\src\express-server\temp 0|конвертер-сервер
| Ошибка конвертации: ENOENT: нет такого файла или каталога, открыть
‘C:\Users\ASUS\AppData\Local\Temp\libreofficeConvert_-27920-hj0lebIxy5v4\source.ods’
Ответ или решение
Ваша проблема с конвертацией документов в Express использует библиотеку libreoffice-convert
, и ваши ошибки, связанные с отсутствием файлов, вероятно, связаны с тем, как библиотека работает с временными файлами и с путями к ним. Давайте рассмотрим, как решить эту проблему шаг за шагом.
1. Проверка путей к временным файлам
Ошибка ENOENT: no such file or directory
говорит о том, что библиотека не может найти файл, который она пытается открыть. Это может произойти по нескольким причинам:
- Временные файлы не создаются или не удаляются корректно.
- Права доступа к временной директории могут быть ограничены.
- Содержимое входного файла может быть недоступным для конвертации.
2. Обновление вашего кода
Мы можем внести несколько изменений в ваш код, чтобы убедиться, что временные файлы создаются и обрабатываются правильно.
const express = require("express");
const libre = require("libreoffice-convert");
const bodyParser = require("body-parser");
const multer = require("multer");
const path = require("path");
const fs = require("fs");
const app = express();
const port = 3000;
// Используем body-parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// Создаем временную директорию
const tempDir = path.join(__dirname, "temp");
if (!fs.existsSync(tempDir)) {
fs.mkdirSync(tempDir);
}
process.env.TMPDIR = tempDir;
// Настраиваем multer для загрузки файлов
const upload = multer({ dest: "uploads/" });
// Функция для удаления файла
const deleteFile = (filePath) => {
setTimeout(() => {
try {
fs.unlinkSync(filePath);
console.log(`Файл успешно удален: ${filePath}`);
} catch (err) {
console.error(`Ошибка при удалении файла ${filePath}:`, err);
}
}, 1000);
};
// Эндпоинт для конвертации документов
app.post("/convert-document", upload.single("file"), (req, res) => {
const inputPath = req.file.path;
const outputFormat = req.body.format || ".pdf"; // Можно сделать проверку формата
const outputPath = path.join(__dirname, "uploads", `${req.file.filename}${outputFormat}`);
console.log(`Начало конвертации: ${inputPath} в ${outputPath}`);
if (!fs.existsSync(inputPath)) {
console.error("Входной файл не существует.");
return res.status(400).send("Входной файл не существует.");
}
// Читаем файл и конвертируем
const file = fs.readFileSync(inputPath);
libre.convert(file, outputFormat, { filter: undefined }, (err, done) => {
if (err) {
console.error(`Ошибка конвертации: ${err.message}`);
return res.status(500).send(`Ошибка конвертации: ${err.message}`);
}
console.log(`Конвертация успешна: ${inputPath} в ${outputPath}`);
fs.writeFileSync(outputPath, done);
res.download(outputPath, (err) => {
if (err) {
console.error("Ошибка при отправке файла:", err);
}
// Очищаем временные файлы
deleteFile(inputPath);
deleteFile(outputPath);
});
});
});
// Запускаем сервер
app.listen(port, () => {
console.log(`Сервер запущен на порту ${port}`);
});
3. Проверка настроек системы
-
Убедитесь, что LibreOffice установлен правильно: Проверьте, что LibreOffice правильно установлен и доступен в вашей системе. Также проверьте, что версия LibreOffice совместима с вашей библиотекой
libreoffice-convert
. - Правила доступа: Убедитесь, что вашему Node.js приложению разрешено записывать и читать из временной директории, а также из директории загрузок.
4. Альтернативные подходы
Если проблема продолжает существовать, вы можете рассмотреть использование других библиотек или подходов для конвертации файлов. Например, unoconv
– это утилита, которая может работать через командную строку и обладает схожими возможностями.
Заключение
Следуя приведенным выше шагам, вы сможете диагностировать и, возможно, решить проблемы с конвертацией документов с использованием LibreOffice в вашем Express-приложении. Если ошибка не устраняется, поищите дополнительные детали о работе библиотеки или проверьте логи системы для поиска больше информации о проблеме.