• Vue+NodeJS上传图片到腾讯云Cos


    一.前端Vue

    1.选择图片
    1. --HTML
    2. <input type="file" accept="image/*" @change="handleFileChange">
    3. <el-button size="large" @click="changeAvatar">上传头像el-button>
    1. //选择图片
    2. function handleFileChange(event){
    3. const selectedFile = event.target.files[0];
    4. if (!selectedFile) {
    5. return;
    6. }
    7. //定义图片可传入的类型
    8. const allowedTypes = ['image/jpeg', 'image/png','image/jpg'];
    9. //定义图片的最大尺寸--字节
    10. const maxSize = 1000000;
    11. if (!allowedTypes.includes(selectedFile.type)) {
    12. return;
    13. }
    14. if (selectedFile.size > maxSize) {
    15. return;
    16. }
    17. }
    2.实现上传前的本地预览
    1. --HTML
    2. "border-radius: 50%;" :src="DataUrl" alt="">
    1. //定义数据
    2. const DataUrl=ref('')
    3. function handleFileChange(event){
    4. //图片大小,类型验证
    5. ......
    6. //读取数据
    7. const reader=new FileReader()
    8. reader.onload=e=>{
    9. DataUrl.value=e.target.result
    10. }
    11. reader.readAsDataURL(selectedFile)
    12. }

    此时读取后得到的是

    后面包含base64,将base64上传到后端进行处理 ,如果图片文件稍大,后端就会出现请求体过长的错误.不适合大文件上传.我们这里就只用它来做本地预览

    3.获取上传到后端必须的数据
    1. //定义数据
    2. const imgType=ref('')
    3. const code=ref({})
    4. function handleFileChange(event){
    5. //图片大小,类型验证
    6. ......
    7. //得到图片的类型后缀
    8. const index=selectedFile.type.indexOf('/')
    9. imgType.value=selectedFile.type.slice(index+1)
    10. //包括开始,不包括结尾
    11. //selectedFile--图片对象
    12. code.value=selectedFile
    13. //读取数据
    14. ...
    15. }
    4.上传图片
    1. async function changeAvatar(){
    2. const formData = new FormData();
    3. formData.append('image',code.value); //图片对象
    4. formData.append('fileType', imgType.value); // 添加文件类型信息
    5. await axios.post('http://127.0.0.1:3000/upload',formData)
    6. .then((response) => {
    7. // 处理后端的响应
    8. console.log('上传成功',response );
    9. }).catch((error) => {
    10. // 处理上传失败的情况
    11. console.error('上传失败', error);
    12. });
    13. }

    二.后端

    后续需要的第三方包

    1. npm i express
    2. npm i cos-nodejs-sdk-v5
    3. npm i cors
    4. npm i multer
    5. npm i dotenv
    1. "cors": "^2.8.5",
    2. "cos-nodejs-sdk-v5": "^2.12.4",
    3. "dotenv": "^16.3.1",
    4. "express": "^4.18.2",
    5. "multer": "^1.4.5-lts.1",
    1.express服务搭建
    1. const express = require('express')
    2. const cors = require('cors');
    3. const multer = require('multer'); // 处理文件上传的中间件
    4. const app = express()
    5. app.use(cors()) //跨域处理
    6. // 配置文件上传的存储路径和文件名
    7. const storage = multer.memoryStorage(); // 在内存中处理文件上传
    8. const upload = multer({ storage });
    9. //COS图片上传请求
    10. router.post('/upload', upload.single('image'), async(req, res) => {
    11. const uploadedImage = req.file;
    12. const fileType = req.body.fileType; // 从请求体中获取文件类型
    13. if (!uploadedImage) {
    14. return res.status(400).send('没有上传文件');
    15. }
    16. const avatar_url=await uploadImage(req.file,fileType)
    17. res.send({data:{avatar_url}})
    18. });
    19. app.listen(3000, () => {
    20. console.log('server running ...');
    21. })
    2.上传到腾讯云Cos
    1. const COS = require('cos-nodejs-sdk-v5')
    2. const {SecretId,SecretKey,Bucket,Region}=require('../config')
    3. const cos = new COS({
    4. SecretId,
    5. SecretKey,
    6. })
    7. const path="avatar/" //腾讯云Cos桶下的文件夹
    8. async function uploadImage(img,type) {
    9. try {
    10. const data = await cos.putObject({
    11. Bucket, // 存储桶名称
    12. Region, // 存储桶所在地域
    13. Key:path + new Date().getTime()+`.${type}`, // 可以理解为图片存储的路径+名称(唯一) 例如:indexImages/1670050961361.png
    14. Body: img.buffer, // 上传文件的内容,可以为 FileStream、字符串、Buffer, 我们这里接收二进制Buffer
    15. onProgress: function (progressData) {
    16. console.log(progressData)
    17. }
    18. })
    19. const imageUrl = `https://${data.Location}`
    20. return imageUrl
    21. }
    22. catch (error) {
    23. console.log(error)
    24. }
    25. }
    26. module.exports = uploadImage
    3.配置文件

    新建一个.env文件

    1. # COS
    2. SecretId='密钥ID'
    3. SecretKey='密钥'
    4. Bucket='桶名称'
    5. Region='所在地域'

    新建一个config.js文件

    1. const dotenv = require("dotenv")
    2. dotenv.config()
    3. module.exports = {
    4. SecretId,
    5. SecretKey,
    6. Bucket,
    7. Region,
    8. } = process.env

    到此Vue上传图片到COS就完成了,后续可以将图片链接存到数据库进行操作.代码有错误的地方欢迎指正.如果使用出现错误也可留言.同时也要注意你的COS权限开放问题

  • 相关阅读:
    【头歌-Python】Python第二章作业(初级)
    【数学建模】MATLAB入门教程:插值与拟合(下)
    MySQL 表中数据的增删改查操作
    多线程笔记
    tensorflow/serving部署keras的h5模型服务
    算法通关村第十二关——字符串反转问题解析
    Spring注解的使用
    PHP:表达式
    ETH2.0 合并,投资者该做些什么准备?
    android 性能优化之网络优化
  • 原文地址:https://blog.csdn.net/m0_71469120/article/details/132687272