expressファイルアップロードミドルウェアMultier詳細

6328 ワード

前言
ExpressではHTTPリクエストボディのデータはデフォルトで処理されず、通常リクエストボディ(JSON、バイナリ、文字列)のデータに対してbody-parserミドルウェアを使用できます.一方、ファイルアップロード(multipart/form-dataリクエスト)は、リクエストフローに基づいて処理したり、formidableモジュールやMultierミドルウェアを使用したりすることができます.
1.マルチミドルウェア
MultierはExpressの公式リリースで、Nodeに使用されています.jsmultipart/form-data要求データ処理のミドルウェア.
busboyに基づいて構築され、ファイルのアップロードを効率的に処理できますが、multipart/form-data以外のユーザーリクエストは処理されません.
2.インストール

npm install multer --save

3.使用
Multierはリクエストボディを解析した後、Requestオブジェクトにbodyオブジェクトとfileまたはfilesオブジェクトを追加します(複数のファイルをアップロードするときにfilesオブジェクトを使用します).ここで、bodyオブジェクトにはコミットされたフォームのテキストフィールド(ある場合)が含まれ、file(またはfiles)オブジェクトにはフォームを介してアップロードされたファイルが含まれます.
基本的な使用例は次のとおりです.

var express = require('express')
var multer = require('multer')
var upload = multer({ dest: 'uploads/' })

var app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {
 // req.file   `avatar`   
 // req.body               (   )
})

app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
 // req.files   `photos`     
 // req.body               (   )
})

var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
 // req.files       (String -> Array),         key,      key  
 //
 //  :
 // req.files['avatar'][0] -> File
 // req.files['gallery'] -> Array
 //
 // req.body               (   )
})

使用中、multipartフォームのテキストフィールドのみを処理する必要がある場合は、multerの.single() .array()、またはfields()メソッドを使用します.
例えば、.array()の方法を以下のように使用することができる.

var express = require('express')
var app = express()
var multer = require('multer')
var upload = multer()

app.post('/profile', upload.array(), function (req, res, next) {
 // req.body        
})

4.MultierのAPI
4.1ファイルオブジェクト
Multierは、アップロードファイルを解析した後、次のフィールドを含むオブジェクトとして保存します.
fieldname-フォームでコミットされたファイル名(inputコントロールのnameプロパティ)
originalname-ユーザーデバイス内のファイルの元の名前
encoding-ファイルの符号化タイプ
mimetype-ファイルのMimeタイプ
size-ファイルのサイズ
destination-ファイルの保存ディレクトリ(DiskStorage)
Filename-destinationのファイル名(DiskStorage)
Path-ファイルをアップロードするフルパス(DiskStorage)
buffer-ファイルオブジェクトのBuffer(MemoryStorage)
4.2方法multer(opts)-オブジェクトの作成
Multierモジュールを参照すると、トップレベルのメソッドが得られます.この方法は工場関数であり,この方法を用いてMultierオブジェクトを作成することができる.オプションオブジェクトを受け入れ、最も基本的なオプションはdestであり、Multierファイルの格納場所を教えます.このオプションを無視すると、ファイルはメモリに保存され、ハードディスク(HDD)には書き込まれません.
デフォルトでは、Multierは名前の競合を回避するためにファイルを再コマンドします.関数の名前を変更し、必要に応じてカスタマイズできます.
Multierのオプションオブジェクトには、次の値を含めることができます.
destまたはstorage-ファイル格納場所
FileFilter-関数、アップロード可能なファイルタイプを制御
limits-アップロードデータ制限(ファイルサイズ)
一般的なWebアプリケーションではdestオプションのみを設定する必要があります.使用例は次のとおりです.

var upload = multer({ dest: 'uploads/' })

アップロードファイルをより制御する必要がある場合は、destの代わりにstorageを使用すると、MultierはストレージエンジンをDiskStorage(ハードディスクストレージ)からMemoryStorage(メモリストレージ)に切り替えます.
Multierオブジェクトを作成すると、次の例を使用してアップロードファイルを受信できます..single(fieldname) -単一ファイルアップロード
fieldnameというアップロードファイルを受信と、アップロードファイルはreqに保存されます.file. .array(fieldname[, maxCount])-複数のファイルのアップロード
fieldnameという名前の、複数のアップロードファイル配列を受信します.オプションのパラメータmaxCountは許容できるファイル数を表し、アップロードされたファイル数がこのパラメータで指定されたデータを超えた場合、エラーが投げ出されます.ファイル配列はreqに保存されます.filesにあります..fields(fields) -複数のファイルのアップロード
fieldsで指定した複数のアップロードファイルを受信します.ファイル配列オブジェクトはreqに保存されます.filesにあります.
Fieldsはオブジェクトを含む配列で、オブジェクトにはnameとmaxCountの2つのプロパティが含まれます.

[
 { name: 'avatar', maxCount: 1 },
 { name: 'gallery', maxCount: 8 }
]
.none()-テキストフィールドのみの解析
テキストフィールドのみを解析します.リクエストにアップロードファイルがある場合、'LIMIT_がトリガーされます.UNEXPECTED_FILE'エラー.この方法はupload.fields([])は似ています..any()-すべてのファイルを受信
リクエストのすべてのファイルを受信します.アップロードファイルの配列はreqに保存されます.filesにあります.
4.3オプションパラメータstorage -ストレージエンジン
このオプションには、次の2つのオプションがあります.
DiskStorage-HDDストレージ
MemoryStorage-メモリストレージ.diskStorage(obj)およびHDDストレージ
HDDストレージエンジンは、ファイルをディスクに保存するための完全な制御を提供します.

var storage = multer.diskStorage({
 destination: function (req, file, cb) {
 cb(null, '/tmp/my-uploads')
 },
 filename: function (req, file, cb) {
 cb(null, file.fieldname + '-' + Date.now())
 }
})

var upload = multer({ storage: storage })
.diskStorage()メソッドは、2つのdestinationとfilenameの2つの属性を含むオブジェクトパラメータを受信するファイル格納位置制御権限を提供する.
destinationは、ファイルのストレージディレクトリを設定するために使用されます.関数または文字列です.このパラメータが指定されていない場合は、システムの一時ディレクトリが使用されます.
filenameはファイル名を設定するために使用されます.このパラメータが指定されていない場合は、ランダムな文字列が使用され、ファイル名には拡張子が含まれません..memoryStorage()とメモリストレージ
メモリストレージエンジンは、Buffer形式でファイルをメモリに保存します.このメソッドにはパラメータがありません.

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
limits -ファイルサイズ
このオプションはファイルサイズを設定するために使用され、Multierはこのオブジェクトをbusboyに渡します.limitsオブジェクトには、次のオプション値が含まれます.
FieldName Size-フィールド名の最大サイズ.デフォルト:100 bytes
フィールドサイズ-フィールド値の最大サイズ.デフォルト:1 MB
fields-ファイル以外のフィールドの最大数.デフォルト:Infinity
file Size-multipartフォームで、ファイルの最大サイズ.デフォルト:Infinity
files-multipartフォームで、ファイルの最大数.デフォルト:Infinity
parts-multipartフォームで、最大コンポーネント(fields+files)数.デフォルト:Infinity
headerPairs-デフォルト:2000fileFilter -ファイルフィルタ
FileFilterは、どのファイルが受け入れられるか、拒否されるかを制御します.使用方法は次のとおりです.

function fileFilter (req, file, cb) {

 //          `cb`,
 //                ,           

 //        ,      `false`。 :
 cb(null, false)

 //         ,    `true`。 :
 cb(null, true)

 //    ,               :
 cb(new Error('I don\'t have a clue!'))
}

まとめ
以上はこの文章のすべての内容で、本文の内容がみんなの学习あるいは仕事に対して一定の助けをもたらすことができることを望んで、もし疑问があればみんなは伝言を残して交流することができます.