Cách nén và giải nén file trong Node.js

Tận dụng gói Archiver và Unzipper để nén và giải nén file trong Node.js rất dễ dàng. Dưới đây là hướng dẫn chi tiết.

Nén và giải nén file bằng Node.js

Lưu trữ file là một hoạt động hàng ngày trong thế giới hiện đại mà mọi người có thể thấy lợi ích của việc nén file hoặc thư mục thành định dạng di động, nhỏ hơn.

ZIP là một trong số định dạng lưu trữ phổ biến nhất được dùng ở thế giới công nghệ và được khuyên dùng bởi nhiều người cần chuyển đổi file raw cho lưu trữ tốt hơn, chuyển đổi hiệu quả hơn hoặc vì lí do khác.

Vậy tại sao bạn nên cân nhắc nén file và và làm thế nào nén file sang dạng ZIP & trích xuất chúng trở lại trạng thái ban đầu theo chương trình bằng Node.js?

Tại sao cần nén file?

File và thư mục có thể rất lớn nên việc chia sẻ và chuyển đổi chúng trở nên khó khăn do hạn chế dung lượng ổ đĩa hoặc mất quá lâu để upload nên đám mây.

Trong những trường hợp đó, bạn nên nén file hoặc thư mục để chúng có kích thước nhỏ hơn. Ngoài việc chuyển đổi file dễ dàng, sau đây cũng là lí do khiến nhiều người muốn nén file:

  • Lưu trữ hiệu quả
  • Cấu trúc & sắp xếp file tốt hơn
  • Bảo mật (mã hóa file và bảo vệ bằng mật khẩu)
  • Đảm bảo tính toàn vẹn cho tập tin
  • Quản lý phiên bản file

Gói Archiver & Unzipper của Node.js

Gói Archiver cung cấp một thư viện hàm tận dụng các luồng Node.js để tạo các kho lưu trữ file nén.

Theo mặc định, gói Archiver hỗ trợ nhiều định dạng nén, bao gồm ZIP, GZIP, và TAR. Gói này cũng cho phép bạn tạo lưu trữ từ file và thư mục, đồng thời tách tệp nén lớn thành nhiều phần nhỏ hơn. Nó cũng cho phép bạn loại bỏ hoặc lọc file trong khi nén.

Unzipper là một gói cực kỳ hiệu quả trong việc trích xuất 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, ch phép lập trình viên trích xuất file ZIP chỉ bằng một vài dòng code.

Gói Archiver & Unzipper là hai lựa chọn ở hướng dẫn này vì chúng tích hợp liền mạch với mô đun fs của Node.js, đảm bảo khả năng tương thích mượt mà và đơn giản.

Cách nén file sang định dạng ZIP trong Node.js

Nén file sang định dạng ZIP trong Node.js dễ như mọi ngôn ngữ khác nhờ gói Archiver. Để tạo tệp nén ZIP trong Node.js ở hướng dẫ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.

Bạn sẽ tạo một tập lệnh Node.js đơn giản để nén file và thư mục sang định dạng ZIP. Tạo một dự án Node mới trên máy tính 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. Chạy npm install archiver --saveterminal để cài đặt nó. Khi quá trình cài đặt gói hoàn tất, tạo file mới trong thư mục dự án và đặt tên nó như ý muốn. Ví dụ: app.js hoặc archiver.js.

Mô đun fs xử lý các hoạt động file, còn gói Archiver sẽ xử lý nén file & thư mục thành dạng ZIP, do đó, tập lệnh này cần cả hai mô đun.

Tạo tệp ZIP từ file

Code sau sẽ triển khai một hàm chấp nhận file làm đối số và tạo phiên bản ZIP đã nén của file.

const archiver = require('archiver')
const fs = require('fs')
 
// Tạo ZIP từ file
const createZipFromFile = (file) => {
    const filePath = __dirname + '/' + file
    const output = fs.createWriteStream(filePath + '.zip')
    const archive = archiver('zip', {
        zlib: { level: 9 } // set compression level to the highest
    })
 
    archive.pipe(output);
    archive.file(filePath, { name: file })
    archive.finalize()
}

Hàm này lấy filename của tệp để nén và tạo một file kết quả với tên tương tự. Sau đó, hàm tạo một tệp nén mới ở cấp độ 9 (cao nhất) và dùng hàm pipe để chuyển các luồng kết quả của file nén thành đầu vào của file đầu ra.

Hàm file thêm một file vào kho lưu trữ. Nó chấp nhận đường dẫn file là tham số và một tham số options tùy chọn tại nới bạn có thể chỉ định thuộc tính của file trong kho lưu trữ.

Tạo file ZIP từ thư mục

Quá trình này cũng tương tự như trên, chỉ khác là bạn sẽ dùng hàm directory của gói Archiver trái ngược với file trong hàm trước.

Dưới đây là code hàm nén thư mục thành tệp ZIP:

// tạo ZIP từ thư mục
const createZipFromFolder = (folder) => {
    const folderPath = __dirname + '/' + folder
    const output = fs.createWriteStream(folderPath + '.zip')
 
    const archive = archiver('zip', {
        zlib: { level: 9 } // set compression level to the highest
    })
 
    archive.pipe(output)
    archive.directory(folderPath, false)
    archive.finalize()
}

Cách giải nén file trong Node.js

Chạy lệnh sau trong terminal để cài đặt gói Unzipper trong dự án:

npm install unzipper --save

Sau khi cài đặt gói, nhập nó vào code và dùng hàm giải nén ZIP như bên dưới:

const unzipper = require("unzipper")
 
//hàm giải nén file ZIP 
const extractZip = async (file) => {
    const filePath = __dirname + '/' + file
    const outputPath = __dirname + '/extracted'
    await fs.createReadStream(filePath)
        .pipe(unzipper.Extract({ path: outputPath }))
        .promise()
}

Thế là xong! Hi vọng bài viết hữu ích với các bạn!

Chủ Nhật, 23/07/2023 16:35
31 👨 363
0 Bình luận
Sắp xếp theo