Home >Web Front-end >Front-end Q&A >nodejs deployment upload compressed package
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.
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.
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.
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.
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.
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!