Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo

简介: 如何使用Vue和Element UI配合Node.js及multiparty模块实现图片上传并反显的功能,包括前端的Element UI组件配置和后端的Node.js服务端代码实现。

我们先看一下效果图
在这里插入图片描述
首先,我利用了Element的一个upload组件,我们可以直接使用它。
html:

 <!-- 上传图片 -->
    <el-upload
     <!-- 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 -->
      :on-change="picChange"
      <!-- 是否在选取文件后立即进行上传-->
      :auto-upload="false"
      action="#"
      <!-- 文件列表的类型-->
      list-type="picture-card"
       <!-- 点击文件列表中已上传的文件时的钩子-->
      :on-preview="handlePictureCardPreview"
       <!-- 文件列表移除文件时的钩子-->
      :on-remove="handleRemove"
       <!-- 上传的文件列表-->
      :file-list="filelist"
    >
      <img v-if="imageUrl" :src="imageUrl" class="avatar" />
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>
    <!-- 从接口获取图片地址 反显 -->
    <!-- src 不会产生跨域问题 -->
    <img class="smallimg" v-for="item of postUrlListDate" :src="item.url" alt="图片" :key="item.url" />

data:

 data() {
   
    return {
   
      postUrlListDate: [],
      filelist: [],
      img: "",
      imageUrl: ""
    };
  },

在接口访问的时候会出现跨域的问题 我们使用代理处理一下
这里使用的vue2 在config /index.js 中修改
如果是vue3可以在根目录下新建问vue.config.js文件配置proxy代理

dev: {
   
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
   
      '/api': {
   
        target: 'http://localhost:3002',
        changeOrigin: true,
        pathRewrite: {
   
          '^/api': ''// /api替换为空会
        }
      }
    },

npm 下载axios

npm i axios

在main.js中全局挂在一下

import axios from 'axios'
Vue.prototype.$axios =axios

在页面使用this.$axios 调用axios的方法

接口调用:

methods: {
   
    picChange(file) {
   
      this.img = file.raw;
      //上传图片
      this.AxiosUp();
    },
    //移除图片
    handleRemove(file, fileList) {
   
      console.log(file, fileList, "file, fileList");
    },
    handlePictureCardPreview(file) {
   
      console.log(file, "file");
      //页面反显图片 
      this.imageUrl = file.url;
    },
     //上传图片信息到服务器
    AxiosUp() {
   
      let formL = new FormData(); //使用FormData上传文件、图片
      使用append向FormData对象中添加键值对
      formL.append("img", this.img);
      this.$axios.post("/api/zjq", formL).then(res => {
   
        if (res.data.success == 200) this.$alert("上传成功~");
        //上传成功后 再次调用获取一遍 页面图片列表刷新
        this.postUrlList();
      });
    },
    //获取图片url信息列表
    postUrlList() {
   
      this.$axios.post("/api/postUrlList").then(res => {
   
        this.postUrlListDate = res.data.arr;
        this.postUrlListDate.map(item => {
   
          item.url = "http://localhost:3002" + item.url;  //后端node服务地址拼接
        });
      });
    }
  },
  mounted() {
   
  //页面挂在加载已经上传的图片列表
    this.postUrlList();
  }

node服务端:
使用express框架快速搭建
我们在routers/index.js中进行配置

var express = require('express');
var router = express.Router();
var fs = require('fs')
var path = require('path')
var multiparty = require("multiparty");//用于处理formData表单
//上传文件接口
router.post('/zjq', (req, res) => {
   
  var form = new multiparty.Form({
    uploadDir: './public/images' });//放置路径
  form.parse(req, function (err, fields, files) {
   
    //...可以给图片进行换名字等操作  //files即为上传图片的信息
  });
  res.send({
    success: 200 })
  //在正式用的时候 会将文件的路径存到数据库中
})
//获取上传的所有文件 列表
//遍历了图片文件夹 获取了当前所有文件 
router.post('/postUrlList', (req, res) => {
   
  let arr = []
  const readDir = (entry) => {
   
    const dirInfo = fs.readdirSync(entry);//读取文件 一层 
    dirInfo.forEach(item => {
   
      const location = path.join(entry, item);
      const info = fs.statSync(location); //检查文件状态 
      if (info.isDirectory()) {
   
        console.log(`dir:${
     location}`);
        readDir(location); //再读取下一层文件夹的文件
      } else {
   
        let obj = {
   
          url: '/public/images/' + item,  //拼接路径 
        }
        arr.push(obj)
      }
    })
  }
  readDir(path.join(__dirname, '../public/images'));
  res.send({
    arr }) //返回数组
})
//图片 img.src 会用到这个接口
router.get('/public/images/:id', (req, res) => {
   
  let {
    id } = req.params  //id 聪params中获取
  //在静态文件夹中查询这个文件名的文件内容 返回给前端
  //path.join  拼接路径
  //readFile读取文件的异步方法
  fs.readFile(path.join(__dirname, '../public/images', id), (err, data) => {
   
    if (err) throw err;
    res.end(data);
  });
})

module.exports = router;

读书破万 下笔有神

2021/08/17补充

fileList =[{url:可以是base64也可以是url链接}],很nice~

目录
相关文章
|
4月前
|
JavaScript
超级实用!详解Node.js中的path模块和events模块
超级实用!详解Node.js中的path模块和events模块
|
缓存 资源调度
umi 解决找不到antd组件库中组件的路径问题 filePath not found of antd/es/float-button
umi 解决找不到antd组件库中组件的路径问题 filePath not found of antd/es/float-button
259 0
|
1月前
|
JavaScript 算法 API
Vue——patch.ts【十四】
Vue——patch.ts【十四】
13 4
|
2月前
|
JavaScript
Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘
Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘
98 1
|
2月前
|
JavaScript
文本,Pinia的使用,(0 , _stores_token_js__WEBPACK_IMPORTED_MODULE_1__.useTokenStore),接口中必须用引入store.js文件
文本,Pinia的使用,(0 , _stores_token_js__WEBPACK_IMPORTED_MODULE_1__.useTokenStore),接口中必须用引入store.js文件
|
3月前
|
JavaScript Linux 开发者
【Node.js】从基础到精通(二)—— Path 模块全解析
【Node.js】从基础到精通(二)—— Path 模块全解析
32 0
|
4月前
|
小程序 开发工具 开发者
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
【微信小程序】微信开发者工具 引用 vant-weapp时“miniprogram/node_modules/@babel/runtime/index.js: 未找到npm包入口文件” 解决办法
241 1
|
4月前
|
数据可视化 JavaScript
Vue-cli可视化界面的bulid构建线上模式打包失败:No module factory available for dependency type: CssDependency
Vue-cli可视化界面的bulid构建线上模式打包失败:No module factory available for dependency type: CssDependency
|
4月前
|
前端开发
最新版本create-react-app 如何使用css-module
最新版本create-react-app 如何使用css-module
40 0
|
4月前
|
JavaScript
Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)
Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)
88 0