Home >Web Front-end >Front-end Q&A >nodejs deployment upload compressed package

nodejs deployment upload compressed package

WBOY
WBOYOriginal
2023-05-08 11:42:07760browse

In modern web development, using Node.js to build back-end applications has become a trend. As applications are constantly updated, we often need to deploy new updated versions on the server. Therefore, this article will introduce how to use Node.js to deploy and upload compressed packages to achieve fast, simple, and efficient application updates.

  1. Compressed file

Before uploading, we need to compress the files to be deployed into a Zip or tar.gz file. It is very simple to use Node.js to complete file compression. You only need to use the built-in "zlib" and "fs" modules of Node.js to easily achieve file compression. The following is a simple compression code:

const fs = require('fs');
const zlib = require('zlib');

const srcFileName = 'srcFile.txt';
const destFileName = 'srcFile.txt.gz';

// 创建压缩流
const gzip = zlib.createGzip();
const inp = fs.createReadStream(srcFileName);
const out = fs.createWriteStream(destFileName);

inp.pipe(gzip).pipe(out);

console.log('文件压缩成功!');

We can encapsulate the above code into a function for future use:

const fs = require('fs');
const zlib = require('zlib');

function compress(file) {
  const gzip = zlib.createGzip();
  const src = fs.createReadStream(file);
  const dest = fs.createWriteStream(file + '.gz');

  src.pipe(gzip).pipe(dest);

  console.log(`文件 ${file} 压缩成功!`);
}

where "file" is the name of the file that needs to be compressed, which can be Relative path or absolute path.

  1. Upload files

After completing the file compression, we need to upload the compressed file to the server. Here we can use third-party modules to implement the file upload function. A commonly used module is "formidable", which is an efficient form parsing module that can help us handle file upload operations.

First, we need to install "formidable":

npm install formidable --save

Then, we can use the following code to implement the file upload function:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');

http.createServer((req, res) => {
  if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
    const form = formidable({ multiples: true });

    form.parse(req, (err, fields, files) => {
      const oldPath = files.file.path;
      const newPath = __dirname + '/uploads/' + files.file.name;

      fs.rename(oldPath, newPath, (err) => {
        if (err) throw err;
        res.writeHead(200, { 'content-type': 'text/plain' });
        res.end('文件上传成功!');
      });
    });

    return;
  }
}).listen(8080);

console.log('服务器启动成功!');

As shown in the above code, we create An HTTP server listening on port 8080. When the client requests a POST request with the URL "/upload", we use "formidable" to parse the file data in the POST request. After parsing, we can obtain relevant information about the uploaded file, including file name, file size, file type, etc. Then we move the files from the temporary path into the upload directory.

It should be noted that when using "formidable" parsing, you need to set "multiples" to true to support uploading multiple files. We can also control the size of the uploaded file, saving path, etc. by setting other parameters.

  1. Decompress the file

After the server receives the compressed file, we need to decompress the file before we can start the update operation. Decompressing files using Node.js is also very simple, just use the built-in "zlib" and "fs" modules of Node.js. The following is a simple decompression code implementation:

const fs = require('fs');
const zlib = require('zlib');

const srcFileName = 'srcFile.txt.gz';
const destFileName = 'srcFile.txt';

// 创建解压流
const gunzip = zlib.createGunzip();
const inp = fs.createReadStream(srcFileName);
const out = fs.createWriteStream(destFileName);

inp.pipe(gunzip).pipe(out);

console.log('文件解压成功!');

Like the compression function, we can also encapsulate the above code into a function for future use:

const fs = require('fs');
const zlib = require('zlib');

function uncompress(file) {
  const gunzip = zlib.createGunzip();
  const src = fs.createReadStream(file);
  const dest = fs.createWriteStream(file.replace('.gz', ''));

  src.pipe(gunzip).pipe(dest);

  console.log(`文件 ${file} 解压成功!`);
}

The "file" is The name of the compressed file to be decompressed, which can be a relative path or an absolute path.

  1. Deploy update

After decompression is completed, we can move the file to the directory where the application is running, overwrite the original application file, and deploy the update in one go It's finished. The following is a simple code implementation:

const fs = require('fs');
const path = require('path');

const appDir = 'app';

function deploy(file) {
  const fileName = path.basename(file);
  const destPath = path.join(appDir, fileName);

  fs.copyFile(file, destPath, (err) => {
    if (err) throw err;
    console.log(`文件 ${fileName} 部署成功!`);
  });
}

The "file" is the decompressed file name that needs to be deployed, which can be a relative path or an absolute path. appDir is the directory where our application runs.

  1. Complete code

Finally, we integrate the code with complete functions above:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
const path = require('path');
const zlib = require('zlib');

const appDir = 'app';

http.createServer((req, res) => {
  if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
    const form = formidable({ multiples: true });

    form.parse(req, (err, fields, files) => {
      const oldPath = files.file.path;
      const newPath = __dirname + '/' + files.file.name;

      fs.rename(oldPath, newPath, (err) => {
        if (err) throw err;

        console.log('文件上传成功!');
        uncompress(newPath);
      });
    });

    return;
  }

  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(`
    <form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" multiple>
        <button type="submit">上传</button>
    </form>
  `);
}).listen(8080);

console.log('服务器启动成功!');

function compress(file) {
  const gzip = zlib.createGzip();
  const src = fs.createReadStream(file);
  const dest = fs.createWriteStream(file + '.gz');

  src.pipe(gzip).pipe(dest);

  console.log(`文件 ${file} 压缩成功!`);
}

function uncompress(file) {
  const gunzip = zlib.createGunzip();
  const src = fs.createReadStream(file);
  const dest = fs.createWriteStream(file.replace('.gz', ''));

  src.pipe(gunzip).pipe(dest);

  console.log(`文件 ${file} 解压成功!`);
  deploy(file.replace('.gz', ''));
}

function deploy(file) {
  const fileName = path.basename(file);
  const dest = path.join(appDir, fileName);

  fs.copyFile(file, dest, (err) => {
    if (err) throw err;
    console.log(`文件 ${fileName} 部署成功!`);
  });
}

The above code implements a simple file upload and compression , decompression, and deployment functions can be customized according to your own needs.

The above is the detailed content of nodejs deployment upload compressed package. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:How to view vue listNext article:How to view vue list