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

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

相关文章
|
存储 JavaScript 前端开发
vue3使用pinia 实现权限code存取
在本文我们一开始了解了pinia是什么以及如果安装使用。接着结合使用pinia实现菜单权限控制的综合实例,来进一步了解pinia的使用。
392 0
|
Rust JavaScript Unix
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
13001 0
|
前端开发
如何用CSS实现不规则形状的背景
在设计网页时,有时需要用到不规则形状的背景。这种背景可以为网页带来更加生动的效果。在这篇文章中,我们将探讨如何用CSS实现不规则形状的背景。
1403 0
|
存储 人工智能 Prometheus
ML 模型监控最佳工具(上)
如果您迟早将模型部署到生产环境,那么您将开始寻找 ML 模型监控工具。 当您的 ML 模型影响业务时,您只需要了解“事物是如何工作的”。 当事物停止工作时,你真正感受到这一点的第一刻。如果没有设置模型监控,您可能不知道哪里出了问题以及从哪里开始寻找问题和解决方案。
|
存储 JavaScript 前端开发
❤Nodejs 第十四章(node中间件multer的认识安装使用)
【4月更文挑战第14天】Multer是Node.js用于处理multipart/form-data的中间件,专注于文件上传。。基本用法包括设置存储引擎,如磁盘存储(DiskStorage)或内存存储(MemoryStorage),并指定处理单个或多个文件的方法。例如,`multer.single(&#39;file&#39;)`处理单个文件上传。存储引擎DiskStorage适合永久保存,而MemoryStorage适合临时处理。可以通过`limits`选项限制文件大小,实现不同类型的文件有不同的大小限制。
934 0
|
前端开发 JavaScript
node接收前端上传的图片,单文件、多文件同name、多文件不同name
本文介绍了在Node.js中使用multer模块接收前端上传的图片,包括单文件上传、多文件上传(同name和不同name)以及任意类型文件上传的方法。
569 0
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
528 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
11月前
|
前端开发
如何在React Router中进行嵌套路由配置?
如何在React Router中进行嵌套路由配置?
565 57
|
JavaScript 前端开发 API
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
本文介绍了如何在Vue 3项目中使用v-md-editor组件库来创建markdown编辑器和预览组件。文章提供了安装步骤、如何在main.js中进行全局配置、以及如何在页面中使用VMdEditor和VMdPreview组件的示例代码。此外,还提供了一个完整示例的链接,包括编辑器和预览组件的使用效果和代码。
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
|
JavaScript 测试技术
vue配置生产环境.env.production、测试环境.env.development
该文章介绍了如何在Vue项目中配置和使用不同的环境变量文件(.env、.env.production、.env.development)以适应开发、测试和生产环境,并通过修改`package.json`中的scripts来实现不同环境的打包。
3915 0
vue配置生产环境.env.production、测试环境.env.development