Конвертация LibreOffice в Express

Вопрос или проблема

Я в настоящее время пытаюсь конвертировать различные файлы, такие как музыка, видео, изображения, и эти три работают нормально, но когда я пытаюсь конвертировать документы с использованием 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-приложении. Если ошибка не устраняется, поищите дополнительные детали о работе библиотеки или проверьте логи системы для поиска больше информации о проблеме.

Оцените материал
Добавить комментарий

Капча загружается...