node.js使用multer在vue中实现图片上传

效果演示

点击上传选择要上传的图片。

上传成功会加载图片的缩略图。

此时,图片以保存在后端的静态目录中。

设计思路

vue中使用input标签上传图片,绑定@change事件,事件负责把图片发送给后端,后端通过multer模块处理前端传来的图片并返回状态码、信息和后端保存的图片的url。

前端设计

如果Ufile里有内容则显示上传的图片,没有则显示点击上传。

html 复制代码
<div class="addImage">
	<input type="file" class="file" id="file" 
	 @change="HandelFile($event)" 
	 accept="image/*">
	 <label for="file" class="filebox" v-if="'' == Ufile">
	    <span>+</span>
	    <p>点击上传</p>
	 </label>
	 <label for="file" class="imgbox" v-if="'' !== Ufile">
	    <img :src="imgUrl" alt="">
	 </label>
</div>

css

css 复制代码
addImage{
   margin: 10px 10px;
   display: inline-block;
    width: 160px;
    height: 125px;
    border: 1px dashed darkgray;
    background: #f8f8f8;
    position: relative;
    overflow: hidden;
    cursor: pointer;
    .file{
      position: absolute;
      top: 0;
      left: 0;
      width: 160px;
      height: 125px;
      opacity: 0;
    }
    .filebox,.imgbox{
      width: 160px;
      height: 125px;
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
      text-align: center;
      span{
         font-size: 40px;
      }
    }
}

选择完图片后会触发HandelFile()图片上传方法,该方法把选择的图片发送给后端,图片是event.target.files[0]里的内容。把图片文件添加到创建的formdata对象中,将数据编译成键值对,以便用XMLHttpRequest来发送数据。

javascript 复制代码
HandelFile(event){
    this.Ufile = event.target.files[0];
    //创建一个formdata对象
    let formData = new FormData();
    //将文件添加到formdata对象中
    formData.append("ile",this.Ufile);
    axios.post('http://localhost:3000/upload',formData).then(res=>{
       this.imgUrl = res.data.url;
    });
 }

后端设计

安装multer模块

复制代码
npm i multer

导入要用到的模块

javascript 复制代码
const express = require("express");
const router = express.Router();
const multer = require("multer");

控制multer文件存储方式,destination是设置文件的保存路径,filename是重命名文件的名称。这里设置保存路径为静态目录public里的upload文件夹,文件名为时间戳+文件原名。

javascript 复制代码
var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './public/upload');
  },
  filename: function (req, file, cb) {
     cb(null,`${Date.now()}-${file.originalname}`);
  }
});
const upload = multer({storage:storage});

方法中的file对象包含有以下信息:

key 描述
fieldname multer帮你生成的文件名
originalname 文件原名
encoding 文件的编码类型
mimetype 文件的 Mime 类型
size 文件大小(以字节为单位)

路由主体,前端请求携带过来的信息会经过upload.any()这个方法处理,下面图片是处理后req.file的内容。

javascript 复制代码
router.post('/', upload.any(),(req,res)=>{
   let url = `http://localhost:3000/upload/${req.files[0].filename}`;
   if(!req.files){
      return res.json({
         status:204,
         message:"没有上传文件"
      })
   }else{
      return res.json({
         status:200,
         message:"上传成功",
         url: url
      })
   }
})
相关推荐
吴永琦(桂林电子科技大学)15 分钟前
HTML5
前端·html·html5
爱因斯坦乐17 分钟前
【HTML】纯前端网页小游戏-戳破彩泡
前端·javascript·html
恋猫de小郭23 分钟前
注意,暂时不要升级 MacOS ,Flutter/RN 等构建 ipa 可能会因 「ITMS-90048」This bundle is invalid 被拒绝
android·前端·flutter
还是鼠鼠1 小时前
Node.js自定义中间件
javascript·vscode·中间件·node.js·json·express
大莲芒4 小时前
react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react17
前端·react.js·前端框架
木木黄木木6 小时前
html5炫酷3D文字效果项目开发实践
前端·3d·html5
Li_Ning217 小时前
【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
前端
胡八一7 小时前
Window调试 ios 的 Safari 浏览器
前端·ios·safari
Dontla7 小时前
前端页面鼠标移动监控(鼠标运动、鼠标监控)鼠标节流处理、throttle、限制触发频率(setTimeout、clearInterval)
前端·javascript
再学一点就睡8 小时前
深拷贝与浅拷贝:代码世界里的永恒与瞬间
前端·javascript