Express实现文件上传原理 form enctype属性 path模块 multer模块
一、要实现文件上传原理要用到的知识点
- form enctype属性
- multer模块
- path模块
二、form enctype属性
注意
用form提交数据时,要提交的数据input标签都要有name属性,否则该值提交无效。
正常情况,form标签的enctype默认属性是 application/x-www-form-urlencoded
是以字符串形式传输的,这次实现文件上传要用到 multipart/form-data
1 | <form action="http://localhost:3000" method="post" enctype="multipart/form-data"> |
语法
<form enctype="value">
属性值
属性 | 描述 |
---|---|
application/x-www-form-urlencoded | 在发送前编码所有字符 (默认) |
multipart/form-data | 不对字符编码。在使用包含文件上传 控件的表单时,必须使用该值。 |
text/plain | 空格转换为 “+” 加号,但不对特殊字符编码。 |
三、multer模块
先安装 cnpm i multer --save
该模块是以中间件的形式存在的
用来接收form表单中的以文件形式上传的文件
例如:
1 | const multer = require('multer'); |
.any()
代表可以接受任何文件类型
可以用req.files
来查看接收的文件
例如:(req.files接收到的数据)
1 | [ { fieldname: 'file', // from表单中的name属性的属性值 |
接收的文件是以数组的形式发送到后端的,数组里面只有一项,是对象
属性 | 描述 |
---|---|
fieldname | Field name 由表单指定 |
originalname | 用户计算机上的文件的名称 |
encoding | 文件编码 |
mimetype | 文件的 MIME 类型 |
size | 文件大小(字节单位) |
destination | 保存路径 |
filename | 保存在 destination 中的文件名 |
path | 已上传文件的完整路径 |
buffer | 一个存放了整个文件的 Buffer |
multer({dest:'地址'})
自动帮你储存 - 名字自动改成hash值
防止重名
缺点:没有后缀
例子:
1 | const mysql = require('mysql'); |
打印的信息:
1 | [ |
效果图:
![1.png](/Express实现文件上传原理 form enctype属性 path模块 multer模块/1.png)
四、path模块
先安装 cnpm i path --save
path.parse(string)用来解析文件路径
1 | const path = require('path'); |
运行结果
1 | { root: 'C:', |
各个属性的描述
root
在什么根目录dir
绝对地址base
文件名+后缀ext
后缀name
文件名
五、最终代码
前端
1 | <form action="http://localhost:3000" method="post" enctype="multipart/form-data"> |
后端
1 | const express = require('express'); |
运行结果
![2.png](/Express实现文件上传原理 form enctype属性 path模块 multer模块/2.png)
![3.png](/Express实现文件上传原理 form enctype属性 path模块 multer模块/3.png)
若想要往数据库里传真正的文件名字需要,否则含有路径
1 | path.parse(src).name+path.parse(req.files[0].originalname).ext; |
第二种:直接在请求中完成
1 | // 前端编辑页面上传的商品图片 |