Как отправлять файлы с помощью NodeJS? (Получение ошибок при открытии отправленных файлов)

#node.js

Вопрос:

Я уже много раз писал этот вопрос и ни от кого не могу найти ответа, поэтому я постараюсь сделать его как можно более подробным, чтобы узнать, знает ли кто-нибудь, что происходит, так как я был заблокирован более недели из-за этой ошибки.

Я создаю веб — сайт с React и его соответствующим API с помощью NodeJS. В Интернете есть часть, где стажер загружает обучение стажера, а затем стажер может загрузить его. Часть загрузки файла уже реализована, и она работает на 100%, проблема возникает, когда мне приходится загружать эти файлы. Когда я загружаю и открываю их, я получаю следующее сообщение (перевод ошибки: произошла ошибка при загрузке PDF-документа).: Ошибка, которую я получаю, когда открываю pdf на испанском языке

Я действительно не знаю, что я делаю неправильно, поэтому ниже я оставляю вам код контроллера express, который я использую в коде nodejs для этой функции api:

 routerTrainer.get("/download-training", verifyJWT, async (req, res) => {
  const { training_id } = req.headers;

  let training = await Training.findOne({
    where: { id: training_id },
  });

  if (training) {
    res.download(`${path}${dirname}${training.file_id}`);
  }
});
 

Несколько комментариев по этому поводу. Прежде всего, я использую res.download (), хотя я также использовал многие другие, такие как res.sendFile (), или я также использовал библиотеку fs для создания файла.pipe(res), и ни один из них не работал для меня. Также добавьте, что я на 100% уверен, что путь к файлу в порядке, я уже проверил его и, наконец, добавлю, что промежуточное программное обеспечение verifyJWT не имеет к этому никакого отношения, это просто верификатор токена веб-токенов Json.

Теперь мы перейдем к части React, здесь, в коде, я также много чего перепробовал, я даже использовал такие библиотеки, как file-saver, и это тоже не сработало для меня (я не знаю, ошибка во внешнем интерфейсе или в бэкэнде) . Вот код функции загрузки React:

 const downloadTraining = async (id) => {
    const fileReader = new FileReader();
    const JWT = new ClassJWT();
    const axiosReq = axios.create();
    await JWT.checkJWT();
    axiosReq
      .get(`${serverPath}/download-training`, {
        headers: {
          training_id: id,
          token: JWT.getToken(),
          responseType: "blob",
        },
      })
      .then((res) => {
        console.log(res);
        fileReader.readAsDataURL(new Blob([res.data]));
      })
      .catch((err) => console.log(err));

    fileReader.addEventListener("loadend", () => {
      const blobString = fileReader.resu<
      const link = document.createElement("a");
      link.href = blobString;
      link.setAttribute("download", "file.pdf");
      document.body.appendChild(link);
      link.click();
    });
  };
 

Я думаю, что все здесь, пожалуйста, спросите, не пропало ли чего-нибудь, я говорю вам, что начинаю немного отчаиваться, потому что я уже потерял больше недели из-за этой ошибки и нигде не могу найти ответ.

Пожалуйста, если кто-нибудь знает, что может произойти, не стесняйтесь отвечать.

Ответ №1:

Если вы посмотрите документацию, я думаю, что тип ответа-это не заголовок, а отдельный параметр (см. https://github.com/axios/axios#request-config).

Вы можете попробовать использовать тип ответа в качестве arraybuffer ?

  ...
 axiosReq
  .get(`${serverPath}/download-training`, {
    headers: {
      training_id: id,
      token: JWT.getToken(),
    },
    responseType: "arraybuffer",
  })
  ...