【Node】腾讯云OSS存储上传图片

目录

准备工作

后端Koa

前端Vue

建议


准备工作

购买腾讯云OSS存储后需要获得以下几个变量

SecretId:秘钥id

SecretKey:秘钥

Bucket:存储桶名称 可在腾讯云的图像界面创建存储桶

Region:购买时选择的区域 我这里是南京

prefix:可选 腾讯云中自定义的文件夹名称 我这里是indexImages

const SecretId = "AK**********Od" // 秘钥id
const SecretKey = "zi**********Am" // 秘钥
const Bucket = "b**********9" // 存储桶名称 可在腾讯云的图像界面创建
const Region = "ap-nanjing" // 购买时选择的区域 我这里是南京
const prefix = "indexImages/" // 可选 腾讯云中自定义的文件夹名称 我这里是indexImages

后端项目中下载依赖cos-nodejs-sdk-v5

npm install cos-nodejs-sdk-v5 --save

后端Koa

/router/infoManage.router.js

路由

const Router = require("koa-router")
const { uploadImage } = require("../controller/infoManage.controller")

const infoManageRouter = new Router()

infoManageRouter.post("/indeximages/uploadImages", uploadImage)

module.exports = infoManageRouter

/controller/infoManage.controller.js

控制层

const infoManageService = require("../service/infoManage.service")
const COS = require("cos-nodejs-sdk-v5")
const { SecretId, SecretKey, Bucket, Region, prefix } = require("../app/config")

const cos = new COS({
  SecretId,
  SecretKey
})

class InfoManageController {
  // 上传图像
  async uploadImage(ctx) {
    try {
      const { base64Code, picType } = ctx.request.body // 获取前端传来的base64编码和图片后缀 如png
      const dataBuffer = Buffer.from(base64Code, "base64") // base64 -> 二进制Buffer
      const data = await cos.putObject({
        Bucket, // 存储桶名称
        Region, // 存储桶所在地域
        Key: prefix + new Date().getTime() + `.${picType}`, // 可以理解为图片存储的路径+名称(唯一) 例如:indexImages/1670050961361.png
        Body: dataBuffer, // 上传文件的内容,可以为 FileStream、字符串、Buffer, 我们这里接收二进制Buffer
        onProgress: function (progressData) {
          console.log(progressData)
        }
      })

      const imageUrl = `https://${data.Location}`
      console.log("上传图片的url为", imageUrl)
      await infoManageService.uploadImage(imageUrl) // 把图片url插入到数据库中
      ctx.body = {
        code: 200,
        message: imageUrl
      }
    } catch (error) {
      console.log(error)
    }
  }
}

module.exports = new InfoManageController()

/service/infoManage.service.js

sql

const connection = require("../app/database")
const dateFormat = require("../utils/date-handle")

class InfoManageService {
  // 上传图片
  async uploadImage(imageUrl) {
    const statement = `INSERT INTO indeximages(imageUrl) VALUES(?)`
    await connection.execute(statement, [imageUrl])
    return true
  }
}

module.exports = new InfoManageService()

前端Vue

<template>
  <div id="poster-manage">
    <input
      @change="uploadPhoto($event)"
      type="file"
      accept="image/gif,image/jpeg,image/jpg,image/png"
    />
  </div>
</template>

<script>
import axios from "axios"

export default {
  name: 'PosterManage',
  methods: {
    // 上传图片
    uploadPhoto(e) {
      const filetype = file.name.split('.')[1] // 图片类型 如png
      const myImg = URL.createObjectURL(e.target.files[0])
      const img = new Image()
      img.src = myImg
      img.onload = function () {
        if (img.width !== img.height * 1.5) {
          console.error('图片的宽高比必须为1.5')
        } else {
          // 利用fileReader对象获取file
          const reader = new FileReader()
          reader.readAsDataURL(file)
          reader.onload = function (e) {
            // 读取到的图片base64 数据编码 将此编码字符串传给后台即可
            const imgcode = e.target.result.split('base64,')[1]
            axios.post("/api/uploadImage", {imgcode, filetype}).then((res) => {
              if (res.data.code === 200) {
                console.log('图片添加成功:', res.data.message)
              }
            })
          }
        }
      }
    }
  },
}
</script>

建议

git提交的时候千万不要把密钥等信息提交了,不然你可能会收到如下邮件

可以创建一个文件.env,在这里添加相关的密钥信息等

下载dotenv,它会帮助我们将环境变量从 .env 文件加载到中 process.env

config.js

const dotenv = require("dotenv")

dotenv.config()

module.exports = {
  APP_HOST,
  APP_PORT,
  MYSQL_HOST,
  MYSQL_PORT,
  MYSQL_DATABASE,
  MYSQL_USER,
  MYSQL_PASSWORD,

  SecretId,
  SecretKey,
  Bucket,
  Region,
  prefix
} = process.env

最后,记得在.gitignore里加上.env

Vue-Ueditor-Wrap是一个用于Vue.js环境下的UEditor组件封装,它可以帮助你在Vue应用中轻松集成富文本编辑器Ueditor。如果你想将秀米图片上传并存储腾讯云OSS(Object Storage Service),你需要按照以下步骤操作: 1. **安装依赖**:首先,在你的Vue项目中安装`vue-ueditor`和`qiniu-sdk`,分别用于UEditor和Qiniu(腾讯云对象存储服务的SDK): ```bash npm install vue-ueditor qiniu-js-sdk ``` 2. **配置UEditor**:在Vue组件中引入并配置Ueditor,添加文件上传相关的插件,例如`imageManager`和自定义的上传处理器: ```javascript import UEditor from 'vue-ueditor' import Qiniu from 'qiniu-js-sdk' Vue.component('vue-ueditor', UEditor) export default { components: { UEditor, }, data() { return { ue: {}, } }, mounted() { this.ue = new UEditor({ ... // 其他配置项 toolbars: ['fullscreen', 'undo redo | forecolor backcolor fontname fontsize emoticons image | imageManager'], // 添加图片管理工具栏 uploadImageAction: '/api/upload-to-qiniu', // 图片上传接口地址 uploadImageShowBase64: true, // 是否显示base64预览 serverUrl: Qiniu.conf.uploadToken(), // 使用Qiniu提供的uploadToken处理上传 }) // 初始化Qiniu SDK Qiniu.init(Qiniu.conf.ACCESS_KEY, Qiniu.conf.SECRET_KEY) }, } ``` 3. **处理图片上传**:创建一个后端API(如'/api/upload-to-qiniu'),该API应接收用户上传的图片数据,并调用Qiniu SDK将图片上传到OSS。示例代码如下: ```javascript // 后端Node.js服务器示例 (Express) const express = require('express'); const multer = require('multer'); const app = express(); const qiniu = require('qiniu'); app.post('/api/upload-to-qiniu', multer({ fileFilter: checkImageFile }), async (req, res) => { try { const file = req.file; const key = `${Date.now()}_${file.originalname}`; const token = await qiniu.uploadToken(bucketName, key); await qiniu.put(file.buffer, key, token); // 返回新的图片URL到前端 res.json({ url: `http://${bucketName}.qiniucdn.com/${key}` }); } catch (error) { console.error(error); res.status(500).json({ error: 'Upload failed' }); } }); async function checkImageFile(req, file) { if (!file.mimetype.startsWith('image')) { return false; } return true; } app.listen(3000, () => console.log('Server started on port 3000')); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值