- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用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/
关于 connect-busboy的页面,我看到了这样的描述:Connect middleware for busboy,但这并没有告诉我任何信息(刚接触 node.js)。 busboy 之间有什么
所以,我有这个帖子请求,它曾经可以正常工作,但是一旦我升级到 Node 10,我似乎无法弄清楚为什么文件事件完全停止触发...... router.post('/uploadImage', authe
我的表格很简单。它使用 ng-flow处理文件上传: 选择图像后,ng-flow 将对目标路由执行 POST。似乎图像已发送,因为请求有效负载有很多类似的东
有一个busboy library 。通过一些 Promise 库,我可以使用以下代码将整个表单数据收集到一个对象中: var p = new Promise((resolve) => { let
我正在尝试使用react作为前端和busboy来将带有标题的图像上传到云存储,以处理后端的上传,但我似乎无法让它工作。当我提交表单时,我收到一条错误消息,指出 event.target.files[0
我有一个将文件上传到 mongodb 的过程,该过程运行良好。但我有一个大问题。如果由于某种原因连接丢失(客户端浏览器关闭、互联网连接不良、断电等),我没有任何指示,并且 Busboy/req 流不会
我有一个表单,需要在其中进行一些文件处理,这需要一些时间,所以我希望完成事件仅在处理完成后执行,现在 Node 正在处理文件,在处理文件并执行命令时, Node 如果找到完成事件,则会触发该事件。那么
是否可以使用 busboy 发出错误并进行处理? 例子: busboy.on('file', function(fieldname, file, filename, encoding, mimetyp
我在使用 Busboy 时遇到了奇怪的问题。我使用 Invoke-RestMethod 将文件从 powershell 上传到用 Node.js 编写的远程服务器。如果我使用流函数,代码可以正常工作。
我正在尝试使用 node.js 作为后端和 angular.js 作为前端将文件上传到服务器。我为此使用 express 4 + busboy。我在前端有一张表,我应该在其中显示我正在上传的所有文件。
我正在使用 busboy ,将我上传的文件写入缓冲区并对其执行一些验证(宽度、高度和文件大小)。一旦我发现上传有问题,我一生都无法弄清楚如何中止/停止流。 例如,如果我想要允许的最大文件大小为 500
我有 multipart/form-data 我要发布到快速端点 /data/upload,下面的表单标记: form(enctype="multipart/form-data", action="/
所以,几天前发生了一些事情,我的一个项目开始显示以下错误: TypeError: Busboy is not a constructor at /app/node_modules/connect-bu
如何使用 busboy 从“val”参数中检索单个字段值? .js app.post('/somewhere', (req, res) => { req.busboy.on('field',
我在上传文件时遇到问题。我有以下代码: App.js var bodyParser = require('body-parser'); var busboy = require('connect-bu
我正在尝试使用express和busboy在Node.js 4.x中实现文件上传。我已经能够上传文件并将其存储在 Azure Blob 存储中。 否,我想在将文件存储到 Azure 之前验证文件类型,
我正在尝试使用express和busboy在Node.js 4.x中实现文件上传。我已经能够上传文件并将其存储在 Azure Blob 存储中。 否,我想在将文件存储到 Azure 之前验证文件类型,
我对 Busboy 有点困惑模块。我不明白文件数据在哪里传输,因为它只接受请求 header 作为参数?!查看文档中的示例: var busboy = new Busboy({ headers: re
当通过 busboy 上传少量文件时,我遇到了事件问题。我的代码: app.post('/multiupload', function(req, res) { var fstream;
我是 Node.js 新手。我想做的是通过我的node.js 服务器将文件上传从网络浏览器流式传输到云存储。 我正在使用“express”、“request”和“busboy”模块。 var expr
我是一名优秀的程序员,十分优秀!