Node.jsを使用して表現しています。
HTTPリクエストのサイズを制限したい。たとえば、誰かが2 MBを超えるHTTPリクエストを送信した場合、そのリクエストをすぐに停止します。コードを見て、コアを変更すればできると思います。しかし、max_request_size
またはそのようなものを設定する方法はありますか?
それは私の2番目の質問に関連しています。 Expressを使用してreq.files
からアップロードされたファイルを取得しています。ファイルサイズが特定のファイルサイズを超えるとすぐに、/tmp
フォルダへのファイルの書き込みを停止する方法(デフォルトのアップロード動作)はありますか?
コメントを追加できないため、更新(07-2014)のみ:
上記のとおり、新しいExpressバージョンではlimit
ミドルウェアの使用が非推奨になり、組み込みオプションBodyParser
ミドルウェアの場合:
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.json({ limit: '5mb' }))
Expressは 使用可能な制限ミドルウェア のあるConnectを使用します。これをExpressアプリで使用するには、次のようにします。
app.use(express.limit('2mb'));
たとえば、すべてのHTTPリクエストが2 MBに制限されます。アップロードされたファイルはHTTPリクエストの一部であるため、2 MBを超えるファイルのアップロードも中止されます。
注:このミドルウェアは非推奨であり、間もなく削除されます。これが当てはまる理由についての議論は、次の場所で利用できます https://github.com/senchalabs/connect/pull/925#issuecomment-26990726
ノードgithubのソースコード:
/* Maximium header size allowed. If the macro is not defined
* before including this header then the default is used. To
* change the maximum header size, define the macro in the build
* environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove
* the effective limit on the size of the header, define the macro
* to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
*/
#ifndef HTTP_MAX_HEADER_SIZE
# define HTTP_MAX_HEADER_SIZE (80*1024)
#endif
したがって、80 * 1024の制限を超えるには、ソースからノードを再構築する必要があります
これをExpress 4で使用して、リクエストの本文サイズ/アップロードファイルのサイズを制限することができます。代わりに、express.json()およびexpress.urlencoded()を使用してください。body-parserモジュールが必要で、そのjson()およびurlencoded()メソッドを使用する必要があります。 、拡張オプションがbodyParser.urlencoded()に対して明示的に定義されていない場合、警告がスローされます(body-parserは非推奨の未定義の拡張を提供:拡張オプションを提供)。
var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
var methodOverride = require('method-override');
app.use(bodyParser.urlencoded({
extended: true, limit: '50mb'
}));
app.use(bodyParser.json({limit: '50mb'}));
app.use(methodOverride());
raw-body
を使用します。ほとんどのミドルウェア(制限など)はExpressにバンドルされなくなったため、個別にインストールする必要があります。ここに例があります。
var getRawBody = require('raw-body')
app.use(function (req, res, next) {
getRawBody(
stream = req,
options = {
length: req.headers['content-length'],
limit: '100mb',
},
callback = function (err, reslt) {
if (err) {
return next(err)
}
next();
console.log(req)
})
})
app.use
の後にルーターを忘れずに追加してくださいExpressでは、以下に示すように、従来のバンドル済みミドルウェアを使用して制限を明示的に設定できなくなりました。
app.use(express.limit('4M'));
質問1の回答:
HTTPリクエストのサイズとアップロードファイルのサイズを制限するには、body-parser
制限。
app.use(bodyParser.urlencoded({limit: '50mb',extended: true}));
app.use(bodyParser.json({limit: '50mb'}));
bodyParser.urlencoded
フロントエンドからのファイルは、urlencodedボディとして提供されます。
URLエンコードされた本体のみを解析するミドルウェアを返します。このパーサーは本文のUTF-8エンコーディングのみを受け入れ、gzipおよびdeflateエンコーディングの自動インフレーションをサポートします。
解析されたデータを含む新しいbodyオブジェクトが、ミドルウェア(つまり、req.body)の後の要求オブジェクトに入力されます。このオブジェクトにはキーと値のペアが含まれ、値は文字列または配列(extendedがfalseの場合)、または任意のタイプ(extendedがtrueの場合)になります。
bodyParser.json
Jsonのみを解析するミドルウェアを返します。このパーサーは本文のUnicodeエンコーディングを受け入れ、gzipおよびdeflateエンコーディングの自動インフレーションをサポートします。
解析されたデータを含む新しいbodyオブジェクトが、ミドルウェア(つまり、req.body)の後の要求オブジェクトに入力されます。
注:デフォルトでは、ボディパーサーの入力制限は100kb
質問2の回答:
デフォルトのアップロードディレクトリを変更するには、以下を使用できます。
app.set('uploadDir', './files'); // Sets the upload Directory to files folder in your project.
その他の実装
アプリにbodyParserを含めながら、アップロードディレクトリについても触れます。
app.use(express.bodyParser({uploadDir:'./files', keepExtensions: true}));
参照:
問題: https://github.com/expressjs/express/issues/1684
お役に立てれば!
廃止されていない更新されたソリューションの場合は、app.jsファイルにそのように制限を追加できます。
app.use(express.json({limit: '2mb'}));
app.use(express.urlencoded({limit: '2mb', extended: false}));
次のようにすることもできます:
app.use(express.json({limit: 2000000}));
app.use(express.urlencoded({limit: 2000000, extended: false}));