Vue + express + multer实现注册的时候上传图片


项目使用elementUI框架,重点实现图片上传

前端部分

界面显示

在这里插入图片描述

图片部分的代码

Vue html部分代码

<template>
    <div class="container">
        <div class="form-container">
            <div style="text-align: center;margin-left: 100px"><h2>欢迎注册</h2></div>
            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
                <el-form-item label="用户名" prop="name">
                    <el-col :span="24">
                        <el-input v-model="ruleForm.user_name"></el-input>
                    </el-col>
                </el-form-item>
                <el-form-item label="帐号" prop="account">
                    <el-col :span="24">
                        <el-input v-model="ruleForm.user_account"></el-input>
                    </el-col>
                </el-form-item>
                <el-form-item label="密码" prop="password">
                    <el-col :span="24">
                        <el-input type="password" v-model="ruleForm.user_password"></el-input>
                    </el-col>
                </el-form-item>
                <!--  使用elementUI的组件,具体请看elementUI的文档   -->
                <el-form-item label="头像" prop="avatar">
                    <el-upload
                            action="#"
                            list-type="picture-card"
                            ref="upload"
                            :multiple="false"
                            :limit="1"
                            :http-request="uploadImg"
                            :on-change="imgChange"
                            :auto-upload="false"
                            :on-preview="handlePictureCardPreview"
                            :on-remove="handleRemove">
                        <i class="el-icon-plus"></i>
                    </el-upload>
                </el-form-item>
                <el-form-item>
                    <el-button type="success" @click="submitForm('ruleForm')">立即注册</el-button>
                </el-form-item>
            </el-form>

        </div>
        <el-dialog :visible.sync="dialogVisible">
            <img width="100%" :src="dialogImageUrl" alt="">
        </el-dialog>
    </div>
</template>

Vue js部分代码

export default {
  data() {
    return {
      ruleForm: {
        user_name: '',
        user_account: '',
        user_password: '',
        avatar: '',
        avatar_url: ''
      },
      dialogImageUrl: '',
      dialogVisible: false,
      // 定义表单规则
      rules: {
        user_name: [
          {required: true, message: '请输入用户名', trigger: 'blur'}
          // {min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
        user_account: [
          {required: true, message: '请输入帐号', trigger: 'blur'}
          // {min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
        user_password: [
          {required: true, message: '请输入密码', trigger: 'blur'}
          // {min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
        avatar: [
          {required: true, message: '请选择头像', trigger: 'blur'}
          // {min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
      }
    };
  },
  methods: {
    // 点击提交后的事件
    submitForm(formName) {
      this.$refs[formName].validate(async (valid) => {
        if (valid) {
          await this.$refs.upload.submit();
        } else {
          return false;
        }
      });
    },
    // 上传图片
    async uploadImg(file) {
      const imgFile = new FormData()
      imgFile.append('file', file.file)
      const {url} = await upload(imgFile)
      this.ruleForm.avatar_url = url
      this.create(this.ruleForm)
    },
    // 创建帐号
    async create(data) {
      const res = await create(data)
      if (res.success){
        this.$message.success('注册成功');
        location.href = '/login'
      }else {
        this.$message.error('该帐号已存在');
      }
    },
    // 图片修改的时候时候修改图片文件
    imgChange(file) {
      this.ruleForm.avatar = file.raw
    },
    // 删除图片
    handleRemove(file, fileList) {
      console.log(file, fileList);
      this.ruleForm.avatar = ''
    },
    // 查看图片
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    }
  }
}

至此前端主要部分完成,接口之类的可以自己定义

后台部分

multer的安装

安装npm install multer -save

使用

var multer = require('multer')

// 判断是否需要创建文件夹
var createFolder = function (folder) {
  try {
    fs.accessSync(folder);
  } catch (e) {
    fs.mkdirSync(folder);
  }
};

// public目录下的images文件夹
var uploadFolder = path.join(__dirname, '../', '/public/images');

createFolder(uploadFolder);

// 通过 filename 属性定制
var storage = multer.diskStorage({
  //确定图片存储的位置
  destination: function (req, file, cb) {
    cb(null, uploadFolder);    // 保存的路径,备注:需要自己创建
  },
  filename: function (req, file, cb) {
     // 将保存文件名设置为 时间戳 + 字段名 
    cb(null, Date.now() + '-' + file.originalname);
  }
});

// 通过 storage 选项来对 上传行为 进行定制化
var upload = multer({storage: storage})

router.post('/upload', upload.single('file'), function (req, res, next) {
  // req.file 是 `avatar` 文件的信息
  // req.body 将具有文本域数据,如果存在的话
  var file = req.file;
  // 返回图片的url
  res.json({
    url: `http://127.0.0.1:3000/images/${req.file.filename}`
  })
  // res.send({ret_code: '0'});
})

后端部分也完成了,接下来就可以进行上传图片保存到后台了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值