Cách nén và giải nén tệp trong Node.js
Lưu trữ tệp là một hoạt động hàng ngày trong thế giới hiện đại vì mọi người đều có thể chứng thực những lợi ích do nén tệp hoặc thư mục mang lại thành các định dạng di động, nhỏ hơn.
Định dạng ZIP là một trong những định dạng lưu trữ phổ biến nhất được sử dụng trong thế giới điện toán và đây là lựa chọn rất được khuyến nghị cho bất kỳ ai cần chuyển đổi tệp thô thành tệp lưu trữ để lưu trữ tốt hơn, truyền tải hiệu quả hoặc bất kỳ lý do nào khác.
Vì vậy, tại sao bạn nên xem xét việc nén các tệp của mình và làm cách nào bạn có thể nén các tệp thành ZIP và giải nén chúng trở lại trạng thái ban đầu theo chương trình bằng Node.js?
Mục Lục
Tại sao nén tập tin?
Rất nhiều lần, các tệp và thư mục trở nên rất lớn và việc chia sẻ hoặc chuyển chúng trở thành một vấn đề vì chúng quá lớn để lưu trữ trên một ổ lưu trữ có dung lượng cụ thể hoặc chúng mất quá nhiều thời gian để tải lên bộ nhớ đám mây .
Trong những tình huống như thế này và nhiều tình huống khác, bạn nên nén các tệp hoặc thư mục đó thành một kích thước nhỏ hơn nhiều. Ngoài việc truyền tệp dễ dàng hơn, các lý do khác khiến bạn có thể xem xét việc nén tệp của mình bao gồm:
- Lưu trữ hiệu quả
- Cấu trúc và tổ chức tệp tốt hơn
- Bảo mật (mã hóa tập tin và bảo vệ bằng mật khẩu)
- tính toàn vẹn của tệp
- Phiên bản tệp
Gói Node.js Archiver và Unzipper là gì?
Tài liệu chính thức của gói Archiver mô tả gói này là “giao diện phát trực tuyến để tạo tệp lưu trữ”. Điều này ngụ ý rằng gói Archiver cung cấp một thư viện các chức năng tận dụng các luồng Node.js để tạo các kho lưu trữ tệp nén.
Theo mặc định, gói Archiver hỗ trợ nhiều định dạng lưu trữ, bao gồm ZIP, GZIP và TAR. Gói này cũng cho phép bạn tạo các kho lưu trữ từ các tệp và thư mục, đồng thời chia các kho lưu trữ lớn thành các phần nhỏ hơn (kho lưu trữ nhiều tập). Nó cũng cho phép bạn loại trừ hoặc lọc các tập tin trong quá trình nén.
Gói Unzipper là một gói rất hiệu quả để giải nén các tệp lưu trữ ZIP trong Node.js. Gói này cung cấp một API dễ sử dụng cho phép các nhà phát triển trích xuất các tệp ZIP chỉ bằng một vài dòng mã.
Các gói Archiver và Unzipper là những lựa chọn cho hướng dẫn này vì chúng tích hợp liền mạch với Node.js fs mô-đun, đảm bảo khả năng tương thích trơn tru và đơn giản.
Cách nén tệp thành định dạng ZIP trong Node.js
Nén các tệp thành định dạng ZIP trong Node.js cũng dễ dàng giống như trong bất kỳ ngôn ngữ nào khác, nhờ gói Archiver. Để tạo kho lưu trữ ZIP trong Node.js trong khi theo dõi phần này, bạn cần thiết lập môi trường phát triển Node.js trên máy tính của mình.
Bạn sẽ tạo một tập lệnh Node.js đơn giản để nén tệp và thư mục thành định dạng ZIP. Tạo một dự án Node mới trên máy tính của bạn bằng cách chạy các lệnh sau:
mkdir node-zip-archiver
cd node-zip-archiver
npm init -y
Tiếp theo, bạn cần cài đặt gói Archiver trong dự án của mình. Chạy npm cài đặt trình lưu trữ –save trong thiết bị đầu cuối của bạn để cài đặt nó. Khi quá trình cài đặt gói hoàn tất, hãy tạo một tệp mới trong thư mục dự án và đặt tên cho nó theo sở thích của bạn, ví dụ: app.js hoặc archiver.js.
Các fs mô-đun xử lý các hoạt động của tệp, trong khi gói Archiver sẽ xử lý việc nén tệp và thư mục vào kho lưu trữ ZIP, do đó, tập lệnh yêu cầu cả hai mô-đun.
Tạo kho lưu trữ ZIP từ tệp
Đoạn mã sau đây là cách triển khai một hàm chấp nhận tệp làm đối số và tạo phiên bản nén ZIP của tệp.
const archiver = require('archiver')
const fs = require('fs')
const createZipFromFile = (file) => {
const filePath = __dirname + "https://www.smartreviewaz.com/" + file
const output = fs.createWriteStream(filePath + '.zip')
const archive = archiver('zip', {
zlib: { level: 9 }
})
archive.pipe(output);
archive.file(filePath, { name: file })
archive.finalize()
}
Hàm lấy tên tệp của tệp để nén và tạo tệp đầu ra có tên tương tự (với điểm khác biệt duy nhất là việc bổ sung phần mở rộng tệp ZIP).
Sau đó, hàm tạo một kho lưu trữ mới với mức nén được đặt thành 9 (cao nhất) và sử dụng đường ống có chức năng chuyển các luồng đầu ra của kho lưu trữ thành đầu vào của tệp đầu ra.
Các tài liệu chức năng thêm một tập tin vào kho lưu trữ. Nó chấp nhận đường dẫn tệp dưới dạng tham số và tùy chọn tùy chọn tham số nơi bạn có thể chỉ định các thuộc tính của tệp trong kho lưu trữ.
Các tên tùy chọn chỉ định tên của tệp trong kho lưu trữ. Nếu tùy chọn không được chỉ định khi thêm tệp vào kho lưu trữ, Trình lưu trữ sẽ đặt tệp vào kho lưu trữ dựa trên đường dẫn ban đầu của nó, giữ nguyên cấu trúc thư mục.
Tuy nhiên, khi nó được cung cấp rõ ràng, Archiver sẽ thêm tệp vào kho lưu trữ mà không có đường dẫn ban đầu, cho phép đặt tên và tổ chức tùy chỉnh trong kho lưu trữ.
Tạo kho lưu trữ ZIP từ thư mục
Quá trình tạo các tệp lưu trữ ZIP từ các thư mục không khác lắm so với quá trình tạo các tệp. Sự khác biệt chính là việc sử dụng gói Archiver danh mục chức năng trái ngược với tài liệu trong chức năng trước đó.
Dưới đây là việc thực hiện chức năng nén thư mục thành kho lưu trữ ZIP.
const createZipFromFolder = (folder) => {
const folderPath = __dirname + "https://www.smartreviewaz.com/" + folder
const output = fs.createWriteStream(folderPath + '.zip') const archive = archiver('zip', {
zlib: { level: 9 }
})
archive.pipe(output)
archive.directory(folderPath, false)
archive.finalize()
}
Các danh mục hàm lấy đường dẫn thư mục làm đối số đầu tiên và cờ làm đối số thứ hai. Cờ xác định vị trí của thư mục trong kho lưu trữ.
Khi cờ được đặt thành SAI, kho lưu trữ kết quả sẽ chỉ chứa nội dung của thư mục, ngoại trừ chính thư mục đó. Nhưng nếu cờ được đặt thành ĐÚNG VẬYTrình lưu trữ sẽ bao gồm chính thư mục đó trong kho lưu trữ được tạo
Nếu bạn muốn tránh làm ô nhiễm vị trí mà bạn đang giải nén kho lưu trữ của mình bằng các tệp từ kho lưu trữ đã nén, bạn nên nghĩ đến việc đặt lá cờ tùy chọn để ĐÚNG VẬY. Tuy nhiên, bạn có thể đặt nó thành SAInếu nó phù hợp hơn với mục đích của bạn.
Cách giải nén tệp trong Node.js
Quá trình giải nén các tệp ZIP trong Node.js có nhiều cách tiếp cận và một số thư viện có sẵn để sử dụng, nhưng trong bài viết này, gói Unzipper được sử dụng.
Chạy lệnh sau trong thiết bị đầu cuối của bạn để cài đặt gói Unzipper trong dự án của bạn.
npm install unzipper --save
Sau khi cài đặt gói, hãy nhập gói đó vào mã của bạn và triển khai chức năng trích xuất ZIP được hiển thị trong mã bên dưới:
const unzipper = require("unzipper")
const extractZip = async (file) => {
const filePath = __dirname + "https://www.smartreviewaz.com/" + file
const outputPath = __dirname + '/extracted'
await fs.createReadStream(filePath)
.pipe(unzipper.Extract({ path: outputPath }))
.promise()
}
Các giải nénZip là một chức năng không đồng bộ tạo luồng đọc để đọc nội dung của tệp ZIP và trích xuất tệp vào đường dẫn đầu ra được chỉ định (nó tạo ra trích xuất thư mục nếu nó không tồn tại).
Trong trường hợp giải nén hoặc trích xuất, không cần xác định các chức năng khác nhau cho các tệp và thư mục, vì tệp lưu trữ ZIP là một tệp không phân biệt nội dung trong đó.
Dưới đây là chức năng bạn có thể thêm vào ứng dụng, để kiểm tra các chức năng bạn đã tạo cho đến nay:
(async function () {
const file = 'test.pdf'
const folder = 'test_folder'
const zipFile = 'test.pdf.zip'
createZipFromFile(file)
console.log('ZIP archive successfully created from file')
createZipFromFolder(folder)
console.log('ZIP archive successfully created from folder')
await extractZip(zipFile)
console.log('ZIP archive extracted successfully')
}) ()
Tất cả các chức năng trước đó là các chức năng mũi tên JavaScript, nhưng chức năng trên thì khác vì nó là một Biểu thức hàm được gọi ngay lập tức gói mã bên trong nó và thực thi nó ngay lập tức.
Nén tệp có lợi trong việc xây dựng các ứng dụng hiệu quả
Mục tiêu luôn phải là làm cho các ứng dụng của bạn hoạt động hiệu quả nhất có thể để phục vụ người dùng tốt hơn và duy trì trải nghiệm người dùng thú vị.
Trong các trường hợp bạn cần truyền nhiều tệp trong ứng dụng của mình, hãy xem xét việc nén và giải nén các tệp trong khi truyền. Hầu hết các ngôn ngữ lập trình hiện đại đều hỗ trợ nén và giải nén tệp hiệu quả.