使用 Node 归档多个文件并立即下载
Archive multiple files with Node and download it immediately
我正在尝试将多个文件压缩到服务器上并在用户请求时下载。我正在使用 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");
});
}
);
前面我用的是 react with actions 和 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 });
});
};
以下是我如何设法创建临时存档、下载并删除它的方法。
这是后端
// 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);
});
};
我正在尝试将多个文件压缩到服务器上并在用户请求时下载。我正在使用 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");
});
}
);
前面我用的是 react with actions 和 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 });
});
};
以下是我如何设法创建临时存档、下载并删除它的方法。
这是后端
// 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);
});
};