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('服务器开启中')
})

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

相关文章
|
前端开发
如何用CSS实现不规则形状的背景
在设计网页时,有时需要用到不规则形状的背景。这种背景可以为网页带来更加生动的效果。在这篇文章中,我们将探讨如何用CSS实现不规则形状的背景。
1367 0
|
存储 人工智能 Prometheus
ML 模型监控最佳工具(上)
如果您迟早将模型部署到生产环境,那么您将开始寻找 ML 模型监控工具。 当您的 ML 模型影响业务时,您只需要了解“事物是如何工作的”。 当事物停止工作时,你真正感受到这一点的第一刻。如果没有设置模型监控,您可能不知道哪里出了问题以及从哪里开始寻找问题和解决方案。
|
Rust JavaScript Unix
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
12273 0
|
前端开发 JavaScript
node接收前端上传的图片,单文件、多文件同name、多文件不同name
本文介绍了在Node.js中使用multer模块接收前端上传的图片,包括单文件上传、多文件上传(同name和不同name)以及任意类型文件上传的方法。
492 0
|
Web App开发 前端开发
【前端异常】Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
【前端异常】Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
1420 0
|
9月前
|
前端开发
如何在React Router中进行嵌套路由配置?
如何在React Router中进行嵌套路由配置?
471 57
|
存储 JavaScript 前端开发
❤Nodejs 第十四章(node中间件multer的认识安装使用)
【4月更文挑战第14天】Multer是Node.js用于处理multipart/form-data的中间件,专注于文件上传。。基本用法包括设置存储引擎,如磁盘存储(DiskStorage)或内存存储(MemoryStorage),并指定处理单个或多个文件的方法。例如,`multer.single(&#39;file&#39;)`处理单个文件上传。存储引擎DiskStorage适合永久保存,而MemoryStorage适合临时处理。可以通过`limits`选项限制文件大小,实现不同类型的文件有不同的大小限制。
815 0
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
应用服务中间件 Apache nginx
宝塔占用80端口
宝塔占用80端口
|
存储 资源调度 JavaScript
Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)
Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)