Nodejs+express中间件实现文件上传
本篇文章给大家详细介绍Nodejs文件上传的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
笔者用nodejs做项目时需要用到文件上传的功能,在网上搜索了很多教程,找到了一个express的中间件,用于处理multipart/form-data
类型的表单数据,可以很方便的将表单中的文件数据保存到服务器。
介绍
multer是一个node.js文件上传中间件,它是在 busboy的基础上开发的,上传的表单数据必须是multipart/form-data
类型,不然会报错。【相关推荐:《nodejs 教程》】
简单的用法
定义存储器
Multer作为express的一个中间件,我们可以很方便的自定义上传的文件目录以及保存的文件名。先看一个最简单的用法,demo1地址:
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); } }) });
我们先创建了一个upload对象,这个对象中destination函数用来定义上传文件的存储的文件夹;filename函数用来修改上传文件存储到服务器的文件名称,这里我们我们加上一个时间戳简单区分一下。这两个函数都是通过回调函数来实现的。每次上传的时候这两个函数都会调用一次,如果是多个文件上传,那个这两个函数就调用多次,调用顺序是先调用destination,然后调用filename。
在两个函数中都会有一个file
对象,表示当前上传的文件对象,有以下几个属性:
- fieldname:上传的字段名
- originalname:上传的文件名
- encoding:文件的编码类型
- mimetype:文件的MIME类型
定义路由回调
//单个文件上传 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 }); });
在express中定义路由的回调函数时,把定义好了的upload对象作为中间件添加进去。如果是单个文件就用single
方法,如果是多个文件就用array
方法,这两个方法都需要传一个页面上定义好的字段名。
在路由的回调函数中,request对象已经有了file属性(单个文件上传)或files属性(多个文件上传),files属性是一个数组,数组的每一个对象都有以下属性:
- fieldname:上传的字段名
- originalname:上传的文件名
- encoding:文件的编码类型
- mimetype:文件的MIME类型
- destination:存储的目录(和destination回调函数中的目录名一致)
- filename:保存的文件名(和filename回调函数中的文件名一致)
- path:保存的相对路径
- size:文件的大小(单位:字节byte)
我们可以发现在路由的回调函数中的file对象比diskStorage中的file对象多了几个属性,这是因为在diskStorage中文件还没有保存,只能知道文件的大致属性;而路由的回调函数文件已经在服务器上保存好了,文件的保存路径以及文件的大小都是已知的。
混合上传
有时候我们可能需要用字段名来对上传的文件进行一下划分,比如说上传多个图片的时候可能有身份证还有头像。虽然可以分开放到两个接口中,但是会产生其他一系列的麻烦事。multer支持对图片进行字段名的划分。demo3地址
//多字段名上传 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: "" //... }] }
过滤文件上传
在文件上传时,有时候会上传一些我们不需要的文件类型,我们需要把一些不需要的文件给过滤掉。demo2地址。
文件类型过滤
var upload = multer({ //...其他代码 fileFilter: function(req, file, cb){ if(file.mimetype == 'image/png'){ cb(null, true) } else { cb(null, false) } } });
在定义存储器的时候,新增一个fileFilter函数,用来过滤掉我们不需要的文件,在回调函数中我们传入true/false来代表是否要保存;如果传了false,那么destination函数和filename函数也不会调用了。
文件大小和数量过滤
var upload = multer({ //...其他代码 limits:{ //限制文件大小10kb fileSize: 10*1000, //限制文件数量 files: 5 } });
在定义存储器的时候,新增一个limits对象,用来控制上传的一些信息,它有以下一些属性:
- fieldNameSize:field 名字最大长度,默认值:100 bytes
- fieldSize:field 值的最大长度,默认值:1MB
- fields:非文件 field 的最大数量
- fileSize:在multipart表单中, 文件最大长度 (字节单位)
- files:在multipart表单中, 文件最大数量
- parts:在multipart表单中, part传输的最大数量(fields + files)
在这边我们把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
更多编程相关知识,请访问:编程入门!!
Atas ialah kandungan terperinci Nodejs+express中间件实现文件上传. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Node.js boleh digunakan sebagai rangka kerja bahagian belakang kerana ia menawarkan ciri seperti prestasi tinggi, kebolehskalaan, sokongan merentas platform, ekosistem yang kaya dan kemudahan pembangunan.

Untuk menyambung ke pangkalan data MySQL, anda perlu mengikuti langkah berikut: Pasang pemacu mysql2. Gunakan mysql2.createConnection() untuk mencipta objek sambungan yang mengandungi alamat hos, port, nama pengguna, kata laluan dan nama pangkalan data. Gunakan connection.query() untuk melaksanakan pertanyaan. Akhir sekali gunakan connection.end() untuk menamatkan sambungan.

Bagaimana untuk melaksanakan muat naik fail menggunakan gRPC? Buat definisi perkhidmatan sokongan, termasuk permintaan dan mesej respons. Pada klien, fail yang hendak dimuat naik dibuka dan dibahagikan kepada beberapa bahagian, kemudian distrim ke pelayan melalui aliran gRPC. Di bahagian pelayan, ketulan fail diterima dan disimpan ke dalam fail. Pelayan menghantar respons selepas muat naik fail selesai untuk menunjukkan sama ada muat naik berjaya.

Pembolehubah global berikut wujud dalam Node.js: Objek global: modul Teras global: proses, konsol, memerlukan pembolehubah persekitaran Runtime: __dirname, __filename, __line, __column Constants: undefined, null, NaN, Infinity, -Infinity

Perbezaan utama antara Node.js dan Java ialah reka bentuk dan ciri: Didorong peristiwa vs. didorong benang: Node.js dipacu peristiwa dan Java dipacu benang. Satu-benang vs. berbilang benang: Node.js menggunakan gelung acara satu-benang dan Java menggunakan seni bina berbilang benang. Persekitaran masa jalan: Node.js berjalan pada enjin JavaScript V8, manakala Java berjalan pada JVM. Sintaks: Node.js menggunakan sintaks JavaScript, manakala Java menggunakan sintaks Java. Tujuan: Node.js sesuai untuk tugas intensif I/O, manakala Java sesuai untuk aplikasi perusahaan besar.

Terdapat dua fail berkaitan npm dalam direktori pemasangan Node.js: npm dan npm.cmd Perbezaannya adalah seperti berikut: sambungan berbeza: npm ialah fail boleh laku dan npm.cmd ialah pintasan tetingkap arahan. Pengguna Windows: npm.cmd boleh digunakan daripada command prompt, npm hanya boleh dijalankan dari baris arahan. Keserasian: npm.cmd adalah khusus untuk sistem Windows, npm tersedia merentas platform. Cadangan penggunaan: Pengguna Windows menggunakan npm.cmd, sistem pengendalian lain menggunakan npm.

Ya, Node.js ialah bahasa pembangunan bahagian belakang. Ia digunakan untuk pembangunan bahagian belakang, termasuk mengendalikan logik perniagaan sebelah pelayan, mengurus sambungan pangkalan data dan menyediakan API.

Langkah-langkah penggunaan pelayan untuk projek Node.js: Sediakan persekitaran penggunaan: dapatkan akses pelayan, pasang Node.js, sediakan repositori Git. Bina aplikasi: Gunakan npm run build untuk menjana kod dan kebergantungan yang boleh digunakan. Muat naik kod ke pelayan: melalui Git atau Protokol Pemindahan Fail. Pasang kebergantungan: SSH ke dalam pelayan dan gunakan pemasangan npm untuk memasang kebergantungan aplikasi. Mulakan aplikasi: Gunakan arahan seperti node index.js untuk memulakan aplikasi, atau gunakan pengurus proses seperti pm2. Konfigurasikan proksi terbalik (pilihan): Gunakan proksi terbalik seperti Nginx atau Apache untuk menghalakan trafik ke aplikasi anda
