node上传文件 + vue3 + elementPlus 组件封装

news2024/12/27 12:22:22

一、node

1.在node环境中安装multer(node.js中间件)包,用于处理 multipart/form-data 类型的表单数据

 npm install --save multer

2.userRouter

var express = require('express');
const multer  = require('multer')
const upload = multer({ dest: 'public/avataruploads/' })

const UserController =  require('../../controllers/admin/UserController');

var router = express.Router();

// 上传图片接口                   
router.post('/adminapi/upload', upload.single('file'), UserController.upload);

module.exports = router;

public/avataruploads/  :上传后存放的路径地址

upload.single('file') :中的file是前端传过来的file文件的键

3.UserController.upload

const UserController = {
    // 上传图片
    upload: async (req, res, next) => { 
        console.log(req.file, 'req.file');
        res.send({code:200,msg:'上传成功',data:{url:'/avataruploads/' + req.file.filename}})
    }
}

module.exports = UserController;

二、Vue

1.upload组件
 

<template>
  <div>
    <!-- :auto-upload="false" -->
    <el-upload
      class="avatar-uploader"
      :action="baseURL + url"
      :headers="{ Authorization: useStore.token }"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :on-error="handleAvatarError"
    >
      <img v-if="imageUrl" :src="imageUrl" class="avatar" />
      <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
    </el-upload>
  </div>
</template>

<script setup lang="ts">
import { ElMessage, type UploadProps } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { baseURL, httpUrl } from '@/utils/request'
import { useUserStore } from '@/stores'
import { useRouter } from 'vue-router'

const router = useRouter()
const useStore = useUserStore()

const props = defineProps({
  file: {
    type: String,
    default: ''
  },
  url: {
    type: String,
    default:  '/adminapi/upload'
  }
})

const emit = defineEmits(['uploadSuccess'])

const imageUrl = ref('')

const handleAvatarSuccess: UploadProps['onSuccess'] = (response, uploadFile) => {
  console.log(response, uploadFile)
  if (response.code === 200) {
    imageUrl.value = response.data.url
    emit('uploadSuccess', response.data.url)
  } else {
    ElMessage.error(response.msg)
  }

  //   imageUrl.value = URL.createObjectURL(uploadFile.raw!)
}

const handleAvatarError: UploadProps['onError'] = (err: Error, uploadFile) => {
  if (err.status === 401) {
    ElMessage.error('登录已过期,请重新登录')
    useStore.delUser()
    return router.replace('/login')
  }
  console.dir(err, uploadFile)
}

watch(imageUrl, (newUrl) => {
  if (newUrl && !newUrl.includes('http')) {
    imageUrl.value = httpUrl + newUrl
  }
})

watch(
  () => props.file,
  (newFile) => {
    imageUrl.value = newFile
  },
  { immediate: true }
)
</script>

<style scoped>
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

利用watch监听了数据的变化 拿到地址并不是带域名的(防止部署服务器时,图片丢失问题)所以更改后把配置后的域名给带上

2. 使用upload组件

<template>
  <Upload :file="ruleForm.avatar" @uploadSuccess="uploadSuccessHandler"></Upload>
</template>

<script lang="ts" setup>

const ruleForm = reactive<RuleForm>({
  avatar: ''
})


const uploadSuccessHandler = (url: string) => {
  console.log(url)
  ruleForm.avatar = url
}

</script>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/840748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity制作护盾——1、闪电护盾

Unity引擎制作闪电护盾效果 大家好&#xff0c;我是阿赵。   这期做一个闪电护盾的效果。 一、效果说明 可以改变闪电的颜色 可以改变范围 改变贴图的平铺次数&#xff0c;也可以做出各种不同感觉的护盾。 二、原理 这个效果看着很复杂&#xff0c;其实只是用了一张N…

我们来谈谈数据链路层

"啊&#xff0c;其实触手可及&#xff01;" 谈到网络层IP&#xff0c;有很多说法都是说&#xff0c;"IP是决定到达对端主机的能力"。而在实际的网络世界中&#xff0c;在各个节点路由器上&#xff0c;游走的报文也是IP报文&#xff01; 但是&#xff0c…

C++入门之stl六大组件--List源码深度剖析及模拟实现

文章目录 前言 一、List源码阅读 二、List常用接口模拟实现 1.定义一个list节点 2.实现一个迭代器 2.2const迭代器 3.定义一个链表&#xff0c;以及实现链表的常用接口 三、List和Vector 总结 前言 本文中出现的模拟实现经过本地vs测试无误&#xff0c;文件已上传gite…

AI大模型来袭,智能客服变天?

配图来自Canva可画 自ChatGPT爆火“出圈”之后&#xff0c;国内外就掀起了一波AI大模型风潮。越来越多的企业都开始布局AI大模型领域&#xff0c;其中不少企业已经推出了自家的AI大模型产品&#xff0c;试图在这股AI浪潮中拔得头筹。而在众多AI大模型中&#xff0c;既有通用大…

Python爬虫如何更换ip防封

作为一名长期扎根在爬虫行业动态ip解决方案的技术员&#xff0c;我发现很多人常常在使用Python爬虫时遇到一个困扰&#xff0c;那就是如何更换IP地址。别担心&#xff0c;今天我就来教你如何在Python爬虫中更换IP&#xff0c;让你的爬虫不再受到IP封锁的困扰。废话不多说&#…

LVS负载均衡(DR)

文章目录 LVS-DR模式配置原理注DR配置添加VIP下载ipvsadm在DR上管理LVS Real-Server RS配置绑定VIP到环回网卡添加访问VIP的路由配置ARP抑制测试&#xff1a; LVS-DR模式配置 原理 当客户端发起请求后由DR处理&#xff0c;通过算法将流量转发至Real-Server中的某一个处理。然后…

8.16CAS

1.CAS 2. 原子类的原理 3.原子类的使用 import java.util.concurrent.atomic.AtomicInteger;public class Test {public static AtomicInteger atomicInteger new AtomicInteger();public static void main(String[] args) throws InterruptedException {System.out.println(…

Python读取及生成pb文件,pb与jsonStr互转,pb与dictJson互转,打包.exe/.sh并转换,很完美跨平台

Python读取及生成pb文件&#xff0c;pb与jsonStr互转&#xff0c;pb与dictJson互转&#xff0c;打包.exe/.sh并转换&#xff0c;很完美跨平台 1. 效果图2. 命令行&#xff1a;proto文件转.class&#xff08;绝对路径或相对路径&#xff09;3. 序列化、反序列化api4. pb转json&a…

搭建MyBatis开发环境

hi,大家好,今天来学习一下MyBatis的相关知识 文章目录 &#x1f9ca;1.MyBatis定义&#x1f9ca;2.为什么要学习MyBatis&#x1f9ca;3.搭建MyBatis开发环境&#x1f350;3.1前置工作--创建数据库和表&#x1f350;3.2在新项目中添加MyBatis的框架&#x1f350;3.3设置MyBatis…

Leetcode31 下一个排列

解题思路&#xff1a; 算法过程的第二步&#xff0c;可以变为将[j,end]排序&#xff0c;然后从[j,end)和i进行比较&#xff0c;在区间j,end区间第一个大于nums[i]后&#xff0c;交换即可 public void nextPermutation(int[] nums) {int len nums.length - 1;for(int i len;i…

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去&#xff0c;在app.json里面配置 在你需要的 页面的 json里面配置&#xff0c;按需引入 然后看文档&#xff0c;再在你的 wxml里面使用就好了

使用DMA传输实现单片机高效串口转发——以STM32系列为例

使用DMA传输实现单片机高效串口转发——以STM32系列为例 DateAuthorVersionNote2023.08.06Dog TaoV1.01. 完成了文档的撰写。 文章目录 使用DMA传输实现单片机高效串口转发——以STM32系列为例应用场景实现流程源码示例串口与中断配置DMA外设配置DMA发送数据函数串口中断服务函…

Java中String方法魔性学习

这里写目录标题 先进行专栏介绍String详解常用构造方法代码演示常用成员方法代码示例总结 先进行专栏介绍 本专栏是自己学Java的旅途&#xff0c;纯手敲的代码&#xff0c;自己跟着黑马课程学习的&#xff0c;并加入一些自己的理解&#xff0c;对代码和笔记 进行适当修改。希望…

【redis】SpringBoot集成redis

目录 1.添加redis依赖2.配置redis3.操作redis3.1 操作string 3.1 操作其它数据类型 4. Spring-Session基于Redis解决共享Session问题4.1 问题提出 4.1 添加依赖 4.2 修改配置4.3 存储和读取 1.添加redis依赖 方法①&#xff1a; <dependency><groupId>org.springf…

ChatGPT已闯入学术界,Elsevier推出AI工具

2022年11月&#xff0c;OpenAI公司发布了ChatGPT&#xff0c;这是迄今为止人工智能在现实世界中最重要的应用之一。 当前&#xff0c;互联网搜索引擎中出现了越来越多的人工智能&#xff08;AI&#xff09;聊天机器人&#xff0c;例如谷歌的Bard和微软的Bing&#xff0c;看起来…

微信小游戏流量主结算财务信息填写指引

微信小游戏个人开发者: 流量主结算财务信息填写指南 一,登录公众平台二,补充财务信息三,补充信息指引四,提交审核五,绑定通知对于微信小游戏个人开发者来说,流量主结算财务信息的填写是非常重要的一步。正确填写可以保证收入的及时结算,而填写不当则可能会导致收入无法到…

wxRibbonBar 常用三种控件Button,DropdownButton,HybridButton

这三种控件的效果如下所示&#xff1a; 点击下拉的效果&#xff1a; 这一部分可以设置wxITEM_CHECK&#xff0c;wxITEM_RADIO等效果 但我们可能更关注实现实例&#xff1a; &#xff08;1&#xff09;MyFrame.h #pragma once #include <wx/wx.h> #include "wx/wx…

vue2-diff算法

1、diff算法是什么&#xff1f; diff算法是一种通过同层的树节点进行比较的高效算法。 其有两个特点&#xff1a; 比较只会在同层级进行&#xff0c;不会跨层级进行。 在diff比较的过程中&#xff0c;循环从两边向中间比较。 diff算法在很多场景中都有应用&#xff0c;在vue中&…

(学习笔记-进程管理)进程

进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着CPU会执行程序中的每一条指令&#xff0c;那么这个运行中的程序就被称为进程。 现在我…

怎么加密文件夹才更安全?安全文件夹加密软件推荐

文件夹加密可以让其中数据更加安全&#xff0c;但并非所有加密方式都能够提高极高的安全强度。那么&#xff0c;怎么加密文件夹才更安全呢&#xff1f;下面我们就来了解一下那些安全的文件夹加密软件。 文件夹加密超级大师 如果要评选最安全的文件夹加密软件&#xff0c;那么文…