gpt4 book ai didi

Node.js Express + Busboy 文件类型检查

转载 作者:行者123 更新时间:2023-12-02 07:50:18 25 4
gpt4 key购买 nike

我正在尝试使用express和busboy在Node.js 4.x中实现文件上传。我已经能够上传文件并将其存储在 Azure Blob 存储中。

否,我想在将文件存储到 Azure 之前验证文件类型,并拒绝任何无效文件。

我想使用魔数(Magic Number)进行验证。我发现const fileType = require('file-type'); 它确定我的文件类型。

现在我正在努力使这项工作尽可能高效,但这是我遇到的困难:我想直接将文件流通过管道传送到azure。但在此之前,我需要将流中的前 5 个字节读取到按文件类型处理的缓冲区中。

从流中读取然后通过管道传输到 azure 肯定行不通。经过一番研究后,我找到了通过将文件传输到 2 个 PassThrough 流中的解决方案。但现在我正在努力正确处理这两个流。

const fileType = require('file-type');
const pass = require('stream').PassThrough;

//...

req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
var b = new pass;
var c = new pass;
file.pipe(b);
file.pipe(c);


var type = null;
b.on('readable', function() {
b.pause();
if(type === null) {
var chunk = b.read(5);
type = fileType(chunk) || false;
b.end();
}
});

b.on('finish', function() {
if(type && ['jpg', 'png', 'gif'].indexOf(type.ext) !== -1) {
var blobStream = blobSvc.createWriteStreamToBlockBlob(storageName,
blobName,
function (error) {
if (error) console.log('blob upload error', error);
else console.log('blob upload complete')
});
c.pipe(blobStream);
}
else {
console.error("Rejected file of type " + type);
}
});

});

此解决方案有时有效 - 有时会出现一些“结束后写入”错误。另外,我认为流没有正确关闭,因为通常在发出请求后,express 会在控制台上记录如下内容:

POST /path - - ms - -

但是此日志消息现在在“blob 上传完成”后 30 到 60 秒内出现,可能是由于超时。

知道如何解决这个问题吗?

最佳答案

您无需添加额外的流。只是unshift()消耗的部分返回到流中。例如:

const fileType = require('file-type');
req.busboy.on('file', function (fieldname, file, filename) {
function readFirstBytes() {
var chunk = file.read(5);
if (!chunk)
return file.once('readable', readFirstBytes);
var type = fileType(chunk);
if (type.ext === 'jpg' || type.ext === 'png' || type.ext === 'gif') {
const blobStream = blobSvc.createWriteStreamToBlockBlob(
storageName,
blobName,
function (error) {
if (error)
console.log('blob upload error', error);
else
console.log('blob upload complete');
}
);
file.unshift(chunk);
file.pipe(blobStream);
} else {
console.error('Rejected file of type ' + type);
file.resume(); // Drain file stream to continue processing form
}
}

readFirstBytes();
});

关于Node.js Express + Busboy 文件类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33974421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com