我需要在node.js中创建一个密码保护的ZIP文件。
我正在使用“node-zip”模块,但不幸的是它不支持密码保护:
var zip = new require('node-zip')();
zip.file('test.file', 'hello there');
var data = zip.generate({base64:false,compression:'DEFLATE'});
在寻找其他节点模块来创建ZIP文件时,我没有找到支持密码保护的任何模块。
我需要在node.js中创建一个密码保护的ZIP文件。
我正在使用“node-zip”模块,但不幸的是它不支持密码保护:
var zip = new require('node-zip')();
zip.file('test.file', 'hello there');
var data = zip.generate({base64:false,compression:'DEFLATE'});
在寻找其他节点模块来创建ZIP文件时,我没有找到支持密码保护的任何模块。
如果您在Linux上工作,那么可以通过zip(大多数Linux发行版中的命令行实用程序)来完成此操作。只需在应用程序中包含以下内容即可。
spawn = require('child_process').spawn;
zip = spawn('zip',['-P', 'password' , 'archive.zip', 'complete path to archive file']);
zip .on('exit', function(code) {
...// Do something with zipfile archive.zip
...// which will be in same location as file/folder given
});
如果你想要压缩文件夹,只需要在文件夹路径前加上另一个参数 '-r',而不是文件路径。child_process
的信息可以在这里http://nodejs.org/api/child_process.html找到。对于像我一样到这里来的任何人,我尝试了node中的几个软件包,但最终选择了这一个:https://www.npmjs.com/package/minizip-asm.js
它支持密码(使用AES),非常容易使用。 我很惊讶它没有那么多下载量,因为这是我发现唯一支持密码的。
var contenido1 = 'contenido super secreto';
var contenido2 = 'otro contenido';
var password = 'pass';
var nombreFichero = 'fichero'
var nodezip = new require('node-zip')();
var fs = require("fs");
nodezip.file('test1.txt', contenido1);
nodezip.file('test2.txt', contenido2);
var data = nodezip.generate({base64:false,compression:'DEFLATE'});
fs.writeFile(nombreFichero + '.zip', data, 'binary');
var exec = require('child_process').exec,
child;
child = exec('unzip ' + nombreFichero + '.zip -d ' + nombreFichero +
' && zip -junk-paths --password ' + password + ' ' + nombreFichero + '-p.zip ' + nombreFichero + '/*' +
' && rm -rf ' + nombreFichero + ' && rm -f ' + nombreFichero + '.zip',
function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});
import { NextApiRequest, NextApiResponse } from 'next';
import formidable from 'formidable';
import { join } from 'path';
import { spawn } from 'child_process';
export const config = {
api: {
bodyParser: false,
},
};
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
return new Promise<void>((resolve, reject) => {
try {
const form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
if (err) {
console.error('Error parsing form data:', err);
res.status(500).json({ error: 'Failed to parse form data' });
reject(err);
return;
}
const password: string = fields.password.toString();
const myFile = fields.myFile;
if (!myFile) {
res.status(400).json({ error: 'File not found in request' });
return;
}
// Decode the Base64 string into a buffer
const fileBuffer = Buffer.from(Array.isArray(myFile) ? myFile[0] : myFile, 'base64');
// Save the file buffer to a temporary file
const tempFilePath = join(process.cwd(), 'zippedFiles', 'temp_file');
require('fs').writeFileSync(tempFilePath, fileBuffer);
// Create a password-protected zip using the `zip` command with `-j` flag
// `-j` flag will store just the file, not the directories
const zipFilePath = join(process.cwd(), 'zippedFiles', 'protected.zip');
const zipProcess = spawn('zip', ['-j', '-P', password, zipFilePath, tempFilePath]);
zipProcess.on('exit', (code) => {
if (code === 0) {
// Zip file creation successful
res.status(200).json({ zipPath: 'protected.zip' });
resolve();
} else {
// Zip file creation failed
console.error('Error creating password-protected zip file');
res.status(500).json({ error: 'Failed to create zip file' });
reject(new Error('Failed to create zip file'));
}
// Delete the temporary file
require('fs').unlinkSync(tempFilePath);
});
});
} catch (error) {
console.error('Error generating password-protected zip:', error);
res.status(500).json({ error: 'Failed to generate zip file' });
reject(error);
}
});
}
import axios from 'axios';
const createPasswordProtectedZip = async (selectedFile: File, password: string) => {
let data = undefined
const base64Data = await readFileAsBase64(selectedFile);
const formData = new FormData();
formData.append('myFile', base64Data);
formData.append('password', password);
data = await axios.post('/api/download-zip', formData).then((res: any) => {
console.log('File response:', res.data);
return res.data
}).catch((e: any) => {
console.log('File error:', e);
return undefined
});
return data
};
const readFileAsBase64 = (file: File) => {
return new Promise<string>((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const result = reader.result;
if (typeof result === 'string') {
const base64Data = result.split(',')[1];
if (base64Data) {
resolve(base64Data);
} else {
reject(new Error('Failed to read the file.'));
}
} else {
reject(new Error('Failed to read the file.'));
}
};
reader.onerror = (error) => {
reject(error);
};
reader.readAsDataURL(file);
});
};
export default createPasswordProtectedZip;