使用elementui及nodejs实现图片上传

单独使用文件上传

1.实现效果

2.图片上传模板

  • class="avatar-uploader" 样式类名

  • :show-file-list="true" 是否显示上传列表

  • :on-success="handleAvatarSuccess" 上传成功的回调函数

  • :before-upload="beforeAvatarUpload" 上传之前的回调函数【可以用于文件格式和大小的判断】

  • :headers="headers" 携带headers头信息【用于携带token信息】

<el-upload class="avatar-uploader" 
  <!-- 图片上传地址 -->
  action="http://127.0.0.1:5000/upload"  
  :show-file-list="true"
  :on-success="handleAvatarSuccess"
  :before-upload="beforeAvatarUpload" 
  :headers="headers">
  <img v-if="imageUrl" :src="imageUrl" class="avatar">
  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
  1. 绑定响应式数据

data(){
  return{
    imageUrl: '', // 上传图片的数据
  }
}
  1. css样式

.avatar-uploader .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .avatar-uploader .el-upload:hover {
    border-color: #409EFF;
  }
  .avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
  }
  .avatar {
    width: 178px;
    height: 178px;
    display: block;
  }
  1. 添加header头信息

headers: {
  Authorization: 'Bearer ' + localStorage.getItem('token')
},
  1. 图片上传处理方法

//图片上传的功能
handleAvatarSuccess(res, file) {
  console.log('success', file);
  // 图片显示到+窗口中
  this.imageUrl = URL.createObjectURL(file.raw);
},
// 格式判断
beforeAvatarUpload(file) {
  const isJPG = file.type === 'image/jpeg';
  // 文件大小,小于2M
  const isLt2M = file.size / 1024 / 1024 < 2;

  // 限制格式,只能上传后缀名是jpeg
  if (!isJPG) {
    this.$message.error('上传头像图片只能是 JPG 格式!');
  }
  // 文件的大小
  if (!isLt2M) {
    this.$message.error('上传头像图片大小不能超过 2MB!');
  }
  return isJPG && isLt2M;
}

配合表单实现图片上传

图片上传

  1. 将图片上传到服务器

  1. 将图片返回的路径地址,添加到数据库

  1. 表单中使用图片上传

<el-form-item label="图片上传" prop="bookurl">
  <!-- 
  不是使用axios上传的图片,使用的是form表单的方式
  添加authorization头部信息
  -->
  <el-upload class="avatar-uploader" 
    action="http://127.0.0.1:5000/upload"  :show-file-list="true"
    :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :headers="headers">
    <img v-if="imageUrl" :src="imageUrl" class="avatar">
    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  </el-upload>
</el-form-item>
  1. 给ruleForm添加bookurl

data(){
  return{
    ruleForm: {
        bookname: '',
        price: '',
        bdesc: '',
        num: '',
        bookurl:'' // 提交到后端服务器
    },
    imageUrl: '', // 上传图片的数据
  }
}
  1. 将图片地址添加到ruleForm中

//图片上传的功能
handleAvatarSuccess(res, file) {
  console.log('success', file);
  // 1. 图片显示到+窗口中
  this.imageUrl = URL.createObjectURL(file.raw);
  // 注意:保存的必须是图片真正存储的目录和地址【nodejs的地址】
  // 2. 把图片上传到服务器
  this.ruleForm.bookurl = file.response.url;
},

nodejs处理

  1. 配置nodejs环境

1.1安装express

npm i express

1.2创建基本的web服务

//1.导入express模块
const express = require('express');
//2.创建web服务器
const app = express();
//3.调用app.listen()函数启动服务器
app.listen(5000, () => {
    console.log('服务器已启动!');
})

使用multer实现图片上传

  • 1.安装

npm i multer  // nodejs用于上传文件的模块 
npm i uuid //uuid用来生成唯一标识符
  • 在项目根目录创建static文件夹,并创建uploadImg子文件夹

  • 配置 utils/upload.js

const multer = require("multer")  // nodejs用于上传文件的模块
const uuid = require("uuid")  //uuid用来生成唯一标识符

/*
  multer是node的中间件, 处理表单数据 主要用于上传文件  multipart/form-data
*/

// 指定存储位置
const storage = multer.diskStorage({
  // 存储位置
  destination(req, file, callback) {
    // 参数一 错误信息   参数二  上传路径(此处指定upload文件夹)
    callback(null, "static/uploadImg")
  },
  // 确定文件名
  filename(req, file, cb) {
    //文件扩展名
    let extName = file.originalname.slice(file.originalname.lastIndexOf('.'))
    //新文件名
    let fileName = uuid.v1()
    cb(null, fileName + extName)
  }
})
// 得到multer对象  传入storage对象
const upload = multer({ storage })
module.exports = upload;
  • 在路由中使用

//图片上传
app.post("/upload", upload.single("file"), (req, res) => {
  // 需要返回图片的访问地址    域名+文件名
  const url = "http://localhost:5000/uploadImg/" + req.file.filename
  // console.log(req.file.filename);
  res.json({ url })
})

效果

### 使用 ElementUI 实现图片上传至本地服务器 为了实现ElementUI 中将图片上传到本地服务器的功能,可以利用 `el-upload` 组件来构建上传界面。此组件提供了多种配置选项以便于开发者自定义上传行为。 #### HTML 结构与基本设置 创建一个简单的HTML结构用于放置上传按钮和其他必要的DOM元素: ```html <template> <div id="app"> <!-- 图片上传控件 --> <el-upload class="upload-demo" action="/api/upload" // 设置请求地址为本地API端点 :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeAvatarUpload" multiple :limit="3" :file-list="fileList"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> <!-- 查看大图对话框 --> <el-dialog v-model="dialogVisible" size="tiny"> <img width="100%" :src="dialogImageUrl" alt=""> </el-dialog> </div> </template> ``` 上述代码片段展示了如何通过指定action属性指向后端处理接口,并设置了几个事件处理器函数名以及一些额外参数如最大数量限制等[^1]。 #### JavaScript 方法实现 接下来,在Vue实例内部编写相应的逻辑方法以响应用户的交互操作: ```javascript <script> export default { data() { return { fileList: [], // 存储已上传成功的文件列表 dialogImageUrl: '', // 当前查看的大图URL dialogVisible: false// 控制模态框显示状态 }; }, methods: { handleRemove(file, fileList) { // 移除文件时触发 console.log(file, fileList); }, handlePreview(file) { // 点击缩略图预览时触发 this.dialogImageUrl = file.url; this.dialogVisible = true; }, beforeAvatarUpload(file){ // 文件上传之前执行的钩子函数 const isJPGorPNG = (file.type === 'image/jpeg' || file.type === 'image/png'); const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPGorPNG) { this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!'); } if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!'); } return isJPGorPNG && isLt2M; } } } </script> ``` 这段JavaScript部分包含了三个主要的方法:当用户尝试移除某个文件时会调用`handleRemove()`;点击某张图片进行预览则会激活`handlePreview()`;而在实际发送HTTP POST请求给服务端之前,则由`beforeAvatarUpload()`负责验证待传入的数据是否满足条件[^2]。 #### 后端 API 接口设计 最后一步是在服务器上搭建好接收这些POST请求的服务程序。这里假设采用Node.js作为运行环境,Express框架简化路由管理过程: ```nodejs const express = require('express') const multer = require('multer') // 处理multipart/form-data编码格式数据中间件 const app = express() let storage = multer.diskStorage({ destination: function(req, file, cb){ let dir='./uploads/'; mkdirp(dir,(err)=>{cb(null,dir)}); }, filename:function(req,file,cb){ cb(null,new Date().toISOString()+path.extname(file.originalname)) } }) var upload = multer({storage}).array('files',12) app.post('/api/upload',(req,res)=>{ try{ upload(req,res,function(err){ if(!err){ res.json({"status":"success","msg":"File uploaded successfully"}); }else{ throw new Error(); } }) }catch(e){ res.status(500).json({'error':e}); } }) ``` 该段Node.js代码使用Multer库解析来自客户端提交过来的二进制流形式的照片资料,并将其保存到项目根目录下的`./uploads/`路径下[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值