この記事では、ファイルをアップロードする Nodejs 方法について詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
nodejs を使用してプロジェクトを実行する場合、ファイルのアップロード機能を使用する必要があり、インターネットで多くのチュートリアルを検索したところ、 マルチパート処理用の Express ミドルウェアを見つけました。 /form-data
タイプのフォーム データは、フォーム内のファイル データをサーバーに簡単に保存できます。
multer は、node.js ファイルアップロードミドルウェアです。busboy に基づいて開発されています。アップロードされるフォームデータは、multipart/form-data# である必要があります。 ## と入力しないと、エラーが報告されます。 [関連する推奨事項:「
nodejs チュートリアル」]
#メモリの定義
demo1 address:
var express = require('express'); var multer = require('multer'); var app = express(); var upload = multer({ storage: multer.diskStorage({ destination: function (req, file, cb) { cb(null, './uploads/'); }, filename: function (req, file, cb) { //file.originalname上传文件的原始文件名 var changedName = (new Date().getTime())+'-'+file.originalname; cb(null, changedName); } }) });
file オブジェクトが存在します。これは現在アップロードされているファイル オブジェクトを表し、次の属性を持ちます:
ルーティング コールバックの定義
//单个文件上传 app.post('/upload/single',upload.single('singleFile'),(req,res)=>{ console.log(req.file); res.json({ code: '0000', type:'single', originalname: req.file.originalname }) }); //多个文件上传 app.post('/upload/multer',upload.array('multerFile'),(req,res)=>{ console.log(req.files); let fileList = []; req.files.map((elem)=>{ fileList.push({ originalname: elem.originalname }) }); res.json({ code: '0000', type:'multer', fileList:fileList }); });
single メソッドを使用します。複数のファイルの場合は、
array メソッドを使用します。どちらのメソッドも、ページで定義されたフィールド名を渡す必要があります。
混合アップロード
複数の画像のアップロードなど、アップロードされたファイルを分割するためにフィールド名を使用する必要がある場合があります。ID をお持ちの場合があります。カードとプロフィール写真。 2 つのインターフェイスに分離できますが、別の一連のトラブルが発生します。 multer は画像をフィールド名に分割することをサポートしています。//多字段名上传 let multipleFields = upload.fields([ {name:'avatar'}, {name:'gallery', maxCount:3}, ]); app.post('/upload/fields', (req,res)=>{ multipleFields(req,res,(err) => { console.log(req.files); if(!!err){ console.log(err.message); res.json({ code: '2000', type: 'field', msg:err.message }) return; } var fileList = []; for(let item in req.files){ var fieldItem = req.files[item]; fieldItem.map((elem) => { fileList.push({ fieldname: elem.fieldname, originalname: elem.originalname }) }); } res.json({ code: '0000', type: 'field', fileList: fileList, msg:'' }) }); });
req.files 属性もありますが、この属性は配列ではなく、複雑なオブジェクトです。多くの属性があり、それぞれ属性名はフィールド名で、各属性の下に配列があり、配列の下にファイル オブジェクトがあります。構造は大まかに次のとおりです:
{ "avatar":[{ fieldname: "", originalname: "" //... }], "gallery":[{ fieldname: "", originalname: "" //... }] }
デモ2アドレス。
ファイル タイプ フィルタリング
var upload = multer({ //...其他代码 fileFilter: function(req, file, cb){ if(file.mimetype == 'image/png'){ cb(null, true) } else { cb(null, false) } } });
文件大小和数量过滤
var upload = multer({ //...其他代码 limits:{ //限制文件大小10kb fileSize: 10*1000, //限制文件数量 files: 5 } });
在定义存储器的时候,新增一个limits对象,用来控制上传的一些信息,它有以下一些属性:
在这边我们把fileSize的值设置得小一点,设为10kb方便测试看效果,但是如果这个时候会发现有报错。因为上传的文件大小很容易就会超过10KB,导致有报错出现,我们就需要在路由回调里对错误的情况进行捕获。
//单个文件上传 let singleUpload = upload.single('singleFile'); app.post('/upload/single',(req,res)=>{ singleUpload(req,res,(err)=>{ if(!!err){ console.log(err.message) res.json({ code: '2000', type:'single', originalname: '', msg: err.message }) return; } if(!!req.file){ res.json({ code: '0000', type:'single', originalname: req.file.originalname, msg: '' }) } else { res.json({ code: '1000', type:'single', originalname: '', msg: '' }) } }); }); //多个文件上传 let multerUpload = upload.array('multerFile'); app.post('/upload/multer', (req,res)=>{ multerUpload(req,res,(err)=>{ if(!!err){ res.json({ code: '2000', type:'multer', fileList:[], msg: err.message }); } let fileList = []; req.files.map((elem)=>{ fileList.push({ originalname: elem.originalname }) }); res.json({ code: '0000', type:'multer', fileList:fileList, msg:'' }); }); });
所有的demo代码都在仓库里,地址:https://github.com/acexyf/multerDemo
更多编程相关知识,请访问:编程入门!!
以上がNodejs+expressミドルウェアでファイルアップロードを実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。