123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- import type { NextApiRequest, NextApiResponse } from "next";
- import path from "path";
- // require modules
- const fs = require("fs");
- const archiver = require("archiver");
- interface IData {
- buildId: string;
- }
- export default async function handler(
- req: NextApiRequest,
- res: NextApiResponse<IData>
- ) {
- const queryObject = req.query;
- console.log("download-id", queryObject);
- const storeFile = __dirname + "/luckysheet-custom-build.zip";
- // create a file to stream archive data to.
- const output = fs.createWriteStream(storeFile);
- const archive = archiver("zip", {
- zlib: { level: 9 }, // Sets the compression level.
- });
- // listen for all archive data to be written
- // 'close' event is fired only when a file descriptor is involved
- output.on("close", ()=> {
- console.log(archive.pointer() + " total bytes");
- console.log(
- "archiver has been finalized and the output file descriptor has closed."
- );
- res.writeHead(200, {
- "Content-Type": "application/octet-stream",
- "Content-Disposition": "attachment; filename=luckysheet-custom-build.zip",
- "Content-Length": archive.pointer(),
- });
- fs.createReadStream(storeFile).pipe(res);
- });
- // This event is fired when the data source is drained no matter what was the data source.
- // It is not part of this library but rather from the NodeJS Stream API.
- // @see: https://nodejs.org/api/stream.html#stream_event_end
- output.on("end", function () {
- console.log("Data has been drained");
- });
- // good practice to catch warnings (ie stat failures and other non-blocking errors)
- archive.on("warning", function (err: any) {
- if (err.code === "ENOENT") {
- // log warning
- } else {
- // throw error
- throw err;
- }
- });
- // good practice to catch this error explicitly
- archive.on("error", function (err: any) {
- throw err;
- });
- // pipe archive data to the file
- archive.pipe(output);
- // append files from a sub-directory, putting its contents at the root of archive
- // path.join(CURR_DIR, 'luckysheet-custom-build')
- const libFolder = path.join(
- __dirname,
- `../../../../luckysheet-custom-build-${queryObject.buildId}/lib/`
- );
- console.log("libFolder", libFolder);
- // // append a file from buffer
- // const buffer3 = Buffer.from("buff it!");
- // archive.append(buffer3, { name: "file3.txt" });
- archive.directory(libFolder, false);
- // finalize the archive (ie we are done appending files but streams have to finish yet)
- // 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand
- archive.finalize();
- // res.status(200).json({ buildId: "download!" });
- }
|