Архивируйте несколько файлов с помощью Node и сразу же загружайте их - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь заархивировать несколько файлов на сервере и загрузить их по запросу пользователя. Я использую adm-zip для архивирования файлов.

Файлы добавляются отлично и архивируются. zip.writeZip ('') прекрасно архивирует файлы и сохраняет их на локальном сервере. Я просто не могу их скачать. В любом случае, я думаю, что было бы лучше, если бы я мог отправлять zip напрямую через буфер.

router.get(
  "/download-zip/:season_id/:club_id",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    FileSubmission.find({
      season: req.params.season_id,
      club: req.params.club_id
    }).then(files => {

      const zip = new AdmZip();

      files.forEach(file => {
        // add local file
        zip.addLocalFile(`uploads/club-uploads/${file.club}/${file.name}`);
      });

      res.download(zip.toBuffer(), "asd.zip");
    });
  }
);

На передней панели я использую реагирование с действиями и библиотеку js-file-download


// Download ALL FILES by season ID and club ID
import fileDownload from "js-file-download";

export const downloadAllFiles = (season_id, club_id) => dispatch => {
  axios
    .get(`/api/files/download-zip/${season_id}/${club_id}`)
    .then(response => {
      fileDownload(response.data, `All Files- ${club_id}.zip`);
    })
    .catch(err => {
      console.log(err);
      dispatch({ type: GET_ERRORS, payload: err.response.data });
    });
};

1 Ответ

0 голосов
/ 16 октября 2019

Хорошо, не знаю, почему я получил отрицательный голос, но вот ответ о том, как мне удалось создать временный архив, загрузить его и удалить его.

Вот серверная часть

// Create a ZIP of files uploaded by a club
router.get(
  "/download-zip/",
  (req, res) => {
      zip.addLocalFile(/*ADD THE FILES TO ZIP*/);

      zip.writeZip(
        `temp/zips/temp-file.zip`,
        err => {
          if (err) {
            console.log(err);
          }

          res.download(
            `uploads/club-zips/test-file.zip`,
            function(err) {
              if (!err) {
                //delete file after it's been downloaded
                fs.unlinkSync(
                  `uploads/club-zips/test-file-${req.params.club_id}.zip`
                );
              }
            }
          );
        }
      );
    });
  }
);

Вот что я использую на передней панели. Как я уже сказал, я использовал пакет js-file-download для загрузки BLOB-объектов

export const downloadAllFiles = () => dispatch => {
  axios
    .get(`/api/files/download-zip/`, {
      responseType: "arraybuffer"
    })
    .then(response => {
      fileDownload(response.data, `all-files.zip`);
    })
    .catch(err => {
      console.log(err);
    });
};
...