我有方法获取URL,我想在其中读取二进制文件,对其进行编辑(重写特定地址中的一些字节(跳过字节)),而不是我想将其返回给用户而不在文件系统上保存(更改)文件)。
我有这段代码来编辑文件,但我不想更改文件系统上的文件并将文件返回给用户(用户想要下载它)。
router.get('/downloadFile', function (req, res, next) {
var id = req.query.id;
var buf = new Buffer(id);
var file = '/opt/file.exe';
var filename = path.basename(file);
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var wstream = fs.createWriteStream(file, {flags: 'w', encoding: 'binary'});
wstream.once('open', function(fd) {
wstream.write(file, buf, 5262720, buf.length, );
wstream.end();
// here i want to send file to user
});
});
更新:上面的一段代码实时编辑文件系统上的文件。因此,当我打开写入流并执行写入操作时 - 此更改立即应用于文件系统上的文件。我找到了这种方式来做我想做的事,现在我问 - 这是正确的方式吗?
var content = fs.readFileSync(file);
var cnt = 5262720;
for (var i = 0; i < buf.length; i++) {
content[cnt] = buf[i];
cnt++;
}
res.end(content);
只需发送内容,无需保存文件。
使用此代码段,用户将从浏览器下载文件。
var http = require("http");
var fs = require("fs");
http.createServer(function(req, res) {
res.setHeader('Content-disposition', 'attachment; filename=file.exe');
res.setHeader('Content-type', 'application/x-msdownload');
//Your logic here...
res.end(content); //The modified file content.
}).listen("8080", "0.0.0.0")