multer实现文件上传功能全解(form上传、fetch请求上传、多文件上传)

简介: multer实现文件上传功能全解(form上传、fetch请求上传、多文件上传)

目录

安装express和multer



npm i express multer -S


基础使用



前端表单

enctype必须指定multipart/form-data,因为multer只支持这种。

name的值“logo”对应服务器upload.single中的“logo”。


    <form action="/postFile" method="post" enctype="multipart/form-data">
        <input id="postFile" type="file" name="logo">
        <button type="submit">上传</button>
    </form>

后端服务器文件

  1. dest对应上传的文件的目录地址。
  2. upload.single的值“logo”对应前端name中的“logo”。
import express from 'express'
import multer from 'multer'
const app = express()
const upload = multer({ dest: 'uploads/' })
app.post('/postFile', upload.single('logo'), (req, res) => {
    res.send(req.file)
})
app.listen(3000, () => {
    console.log('服务器开启中')
})
--

启动服务。

image.png

去页面选择文件上传一张图片,上传成功。

image.png

配置上传文件名


我们发现虽然上传了,但是文件不是我们想要的样子,没有后缀,也不知道是我们上传的图片文件。

我们可以对multer进行详细的配置。

  1. destination配置上传文件的位置
  2. filename配置文件名,可以利用file上传文件的内容进行配置:
import express from 'express'
import multer from 'multer'
const app = express()
// const upload = multer({ dest: 'uploads/' })
const upload = multer({
    storage: multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './uploads/')
        },
        filename: function (req, file, cb) {
            // fieldname是表单的name值,也就是我们设定的“logo”,
            // originalname是文件上传时的名字,可以根据它获取后缀,
            // encoding,mimetype 我就不详细介绍了,可以自行输出查看。
            const { fieldname, originalname, encoding, mimetype } = file
            const after = originalname.split('.')[1] ? '.' + originalname.split('.')[1] : '.jpg'
            cb(null, fieldname + after);
        }
    })
})
app.post('/postFile', upload.single('logo'), (req, res) => {
    res.send(req.file)
})
app.listen(3000, () => {
    console.log('服务器开启中')
})

然后我们重启服务器,再上传一次图片,就有了。

image.png

使用fetch上传文件



后端问题解决了我们看看前端的问题,表单上传文件不仅拓展差,还会跳转新页面,令人头疼。


我们肯定更希望用js中的fetch手动上传。如果还不会使用fetch可以先移步:fetch异步请求使用详解


我们去掉form表单,自定义一个上传事件。


我的前端页面在8080端口,也做了nginx代理请求到3000端口,你们可以自行修改成自己的请求。

body.append(‘logo’, file)这里的作为key的“logo”代替了原本表单中的name值“logo”的作用。

虽然是post请求,但是不要添加请求头’Content-Type’: ‘multipart/form-data’,上传文件时post已经自动帮你识别了,再加就要报错了。

<body>
    <input id="postFile" type="file" name="logo">
    <button type="button" onclick="upload()">上传</button>
</body>
<script>
    const upload = async () => {
        const body = new FormData()
        const file = document.getElementById('postFile').files[0]
        if (file) {
            body.append('logo', file)
            const response = await fetch('http://localhost:8080/postFile', {
                method: 'post',
                body
            })
            const res = await response.json()
            console.log(res)
        } else {
            alert('请选择文件!')
        }
    }
</script>

多文件上传


前端表单

  1. input加上multiple,支持多文件。
  2. 因为现在是多文件了,就不直接取文件,我们先获取用id获取dom,遍历添加进body,记得“logo”要对应后台“logo”。
<body>
    <input id="postFile" type="file" name="logo" multiple>
    <button type="sub" onclick="upload()">上传</button>
</body>
<script>
    const upload = async () => {
        const body = new FormData()
        const postFile = document.getElementById('postFile')
        if (postFile.files[0]) {
            for (const file of postFile.files) {
                body.append('logo', file)
            }
            const response = await fetch('http://localhost:8080/postFile', {
                method: 'post',
                body
            })
            const res = await response.json()
            console.log(res)
        } else {
            alert('请选择文件!')
        }
    }
</script>

后端服务器文件

  1. upload.single(‘logo’)改成upload.array(‘logo’, 3),后面的数字是限制上传文件数。
  2. 命名我们就用本来的名字,好区分不同的文件。
import express from 'express'
import mysql from 'mysql'
import multer from 'multer'
const app = express()
// const upload = multer({ dest: 'uploads/' })
const upload = multer({
    storage: multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './uploads/')
        },
        filename: function (req, file, cb) {
            const { fieldname, originalname, encoding, mimetype } = file
            // const after = originalname.split('.')[1] ? '.' + originalname.split('.')[1] : '.jpg'
            cb(null, originalname);
        }
    })
})
app.post('/postFile', upload.array('logo', 3), (req, res) => {
    res.send(req.files)
})
app.listen(3000, () => {
    console.log('服务器开启中')
})

大功告成,有帮助的话不妨点个赞吧,如果有什么问题可以评论区提出,会及时更新解决。

相关文章
|
23天前
|
前端开发
前端通过input标签封装Upload组件实现文件上传
前端通过input标签封装Upload组件实现文件上传
106 0
|
7月前
LayUI upload上传组件上传文件的两种方式
LayUI upload上传组件上传文件的两种方式
436 0
|
8月前
|
人工智能 小程序 前端开发
【uniapp小程序】uploadFile文件上传
【uniapp小程序】uploadFile文件上传
537 0
|
10月前
|
JavaScript
VUE上传功能本地上传正常,打包上传后报错TypeError: ***.upload.addEventListener is not a function
VUE上传功能本地上传正常,打包上传后报错TypeError: ***.upload.addEventListener is not a function
373 0
|
23天前
|
移动开发 前端开发
VForm3的文件上传方式
VForm3的文件上传方式
39 0
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
4400 0
|
10月前
requests--文件上传,文件下载
requests--文件上传,文件下载
|
12月前
|
JavaScript
FormData可以做些什么事,除了文件上传当然还有文件分片上传呀
FormData 是一个用于表单数据的键值对,可以通过 FormData 对象来模拟表单提交,也可以通过 FormData 对象来实现文件上传。
249 0
|
前端开发 JavaScript
el-upload上传文件和表单一起提交+后端接收代码
el-upload上传文件和表单一起提交+后端接收代码
442 3
el-upload上传文件和表单一起提交+后端接收代码
|
前端开发 Python
ElementUI上传组件el-upload自定义http-request上传到Flask服务
ElementUI上传组件el-upload自定义http-request上传到Flask服务
502 0
ElementUI上传组件el-upload自定义http-request上传到Flask服务