这似乎应该是一个相当简单的问题,但我真的很难想出如何解决它。
我正在使用Node.jsExpress构建一个Web应用程序,我发现在大多数情况下,Express公开的连接BodyParser非常有用。然而,我希望对多部分表单数据POSTS有更细粒度的访问——我需要将输入流管道到另一台服务器,并且希望避免首先下载整个文件。
然而,因为我正在使用快速身体解析器,所以所有文件上传都会自动解析,并在它们到达我的任何功能之前使用“request.files”进行上传和可用。
有没有一种方法可以让我在不禁用BodyParser的情况下禁用多部分formdata帖子的BodyParser?
当您键入app时。使用(express.bodyParser())
,几乎每个请求都将通过bodyParser
函数(将执行哪一个函数取决于内容类型
标题)。
默认情况下,支持3个标头(AFAIR)。你可以肯定地看到消息来源。您可以(重新)定义Content-Type
的处理程序,如下所示:
var express = require('express');
var bodyParser = express.bodyParser;
// redefine handler for Content-Type: multipart/form-data
bodyParser.parse('multipart/form-data') = function(req, options, next) {
// parse request body your way; example of such action:
// https://github.com/senchalabs/connect/blob/master/lib/middleware/multipart.js
// for your needs it will probably be this:
next();
}
Express 3中的情况发生了变化,因此我正在共享工作项目中更新的代码(应该是app.use
ed,然后再Express.bodyParser()
):
var connectUtils = require('express/node_modules/connect/lib/utils');
/**
* Parses body and puts it to `request.rawBody`.
* @param {Array|String} contentTypes Value(s) of Content-Type header for which
parser will be applied.
* @return {Function} Express Middleware
*/
module.exports = function(contentTypes) {
contentTypes = Array.isArray(contentTypes) ? contentTypes
: [contentTypes];
return function (req, res, next) {
if (req._body)
return next();
req.body = req.body || {};
if (!connectUtils.hasBody(req))
return next();
if (-1 === contentTypes.indexOf(req.header('content-type')))
return next();
req.setEncoding('utf8'); // Reconsider this line!
req._body = true; // Mark as parsed for other body parsers.
req.rawBody = '';
req.on('data', function (chunk) {
req.rawBody += chunk;
});
req.on('end', next);
};
};
和一些伪代码,关于原始问题:
function disableParserForContentType(req, res, next) {
if (req.contentType in options.contentTypes) {
req._body = true;
next();
}
}
如果正文解析的需要仅取决于路由本身,最简单的方法是将bodyParser
作为路由中间件功能,仅用于需要它的路由,而不是在应用程序范围内使用它:
var express=require('express');
var app=express.createServer();
app.post('/body', express.bodyParser(), function(req, res) {
res.send(typeof(req.body), {'Content-Type': 'text/plain'});
});
app.post('/nobody', function(req, res) {
res.send(typeof(req.body), {'Content-Type': 'text/plain'});
});
app.listen(2484);
如果您需要使用由express.bodyParser
提供的功能,但您想对Multipart/form-data禁用它,技巧是不要直接使用express.bodyParser
。/>Parser是一个方便的方法,它包装了另外三个方法:express.json
、express.urlencoded
和express.multipart
。
因此,与其说
app.use(express.bodyParser())
你只需要说
app.use(express.json())
.use(express.urlencoded())
这为您提供了身体解析器对大多数数据的所有好处,同时允许您独立处理formdata上传。
编辑:json
和urlencoded
现在不再与Express捆绑。它们由单独的主体解析器模块提供,您现在使用它们如下:
bodyParser = require("body-parser")
app.use(bodyParser.json())
.use(bodyParser.urlencoded())
这个问题非常类似于如何禁用ExpressBodyParser进行文件上传(Node.js)。他们提供的答案是针对Express3的,我用更新后的Express4尝试了这个解决方案,但它似乎不起作用。 我正在使用Node.jsExpress构建一个Web应用程序。我正在使用另一个库,BodyParser,来解析后参数。然而,我希望对多部分表单数据POSTS有更细粒度的访问——我需要将输入流管道到另一
问题内容: 看来这应该是一个相当简单的问题,但是我很难确定如何解决它。 我正在使用Node.js + Express构建一个Web应用程序,并且发现表达暴露的connect BodyParser在大多数情况下非常有用。但是,我想对多部分表单数据POSTS进行更细粒度的访问- 我需要将输入流通过管道传输到另一台服务器,并且希望避免先下载整个文件。 但是,由于我使用的是Express BodyPars
如何使用改造上传多文件, 我尝试使用以下代码上载文件: ApiService: 以及上传方法: 和php代码: 此代码仅适用于一个文件,我不知道原因, 任何帮助,提前感谢。
我正在执行使用Python请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到同样的问题,即服务器无法接收文件: 我正在用我的文件名填充upload_file关键字的值,因为如果我把它留空,它会说 现在我得到了 只有当文件为空时才会显示。所以我一直在思考如何成功地发送文件。我知道这个文件是有效的,因为如果我去这个网站手动填写表单,它会返回一个匹配对象的列表,这就是我想要的
问题内容: 关于此问题还有其他一些问题: boto.exception.S3ResponseError:S3ResponseError:403禁止 S3ResponseError:S3ResponseError:403禁止 S3ResponseError:403禁止使用Boto Python:Amazon S3无法达到目标:说“ 403 Forbidden” 但是,似乎我可能遇到了其他问题(例如,
我花了几个小时试图将文件上载到本地服务器文件夹,但比预期的困难,请帮助。 在我的前端下面插入文件 下面是我的控制器