一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取

  1. 点击注册🔗开通七牛开发者帐号
  2. 如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key

2. Node.js获取七牛token

安装qiniu

npm install qiniu

创建空间
在这里插入图片描述

Node获取token

const qiniu = require('qiniu');
const ACCESS_KEY = 'xxx';
const SECRET_KEY = 'xxx';
const mac = new qiniu.auth.digest.Mac(ACCESS_KEY, SECRET_KEY);const {Auth} = require('@middlewares/auth');
const AUTH_ADMIN = 16;const {Resolve} = require('@lib/helper');
const res = new Resolve();const Router = require('koa-router');const router = new Router({prefix: '/api/v1'
});// 获取token
router.post('/upload/token', new Auth(AUTH_ADMIN).m, async ctx => {const options = {scope: 'xxx', //你的存储空间名称expires: 7200};const putPolicy = new qiniu.rs.PutPolicy(options);ctx.response.status = 200;const data = {token: putPolicy.uploadToken(mac)};ctx.body = res.json(data);
});module.exports = router;

3. Vue获取token并上传图片

获取token

//src/api/upload.js
import request from '@/utils/request';// 获取上传图片token
export function getToken(params) {return request({url: '/upload/token',method: 'post',params});
}
<template><section class="wrap"><el-formref="ruleForm":model="ruleForm":rules="rules"label-width="120px"class="demo-ruleForm"><el-form-item label="标题" prop="title"><el-input v-model="ruleForm.title" /></el-form-item><el-form-item label="描述" prop="description"><el-input v-model="ruleForm.description" /></el-form-item><el-form-item label="SEO关键字" prop="seo_keyword"><el-input v-model="ruleForm.seo_keyword" /></el-form-item><el-form-item label="图片" prop="img_url"><el-uploadclass="avatar-uploader"action="https://upload-z0.qiniup.com/":show-file-list="false":data="{ token }":on-success="handleUploadSuccess"><imgv-if="ruleForm.img_url"width="80"height="80":src="ruleForm.img_url"class="avatar"/><i v-else class="el-icon-plus avatar-uploader-icon" /></el-upload></el-form-item><el-form-item label="展示" prop="status"><el-radio-group v-model="ruleForm.status"><el-radio :label="1">显示</el-radio><el-radio :label="0">隐藏</el-radio></el-radio-group></el-form-item><el-form-item label="分类" prop="category_id"><el-select v-model="ruleForm.category_id" placeholder="请选择分类"><el-optionv-for="item in categoryList":key="item.id":label="item.name":value="item.id"/></el-select></el-form-item><el-form-item label="排序" prop="sort_order"><el-input v-model="ruleForm.sort_order" /></el-form-item><el-form-item label="内容" prop="content"><mavon-editorref="md"v-model="ruleForm.content"code-style="atom-one-dark"@imgAdd="$imgAdd"@imgDel="$imgDel"/></el-form-item><el-form-item><el-button @click="resetForm('ruleForm')">重置</el-button><el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button></el-form-item></el-form></section>
</template><script>
import { mapState } from "vuex";
import { create } from "@/api/article";
import { list } from "@/api/category";
import { getToken } from "@/api/upload";
import axios from "axios";export default {name: "CategoryCreate",data() {return {token: "",categoryList: [],ruleForm: {title: "",description: "",img_url: "",seo_keyword: "",status: 1,sort_order: 1,admin_id: "",category_id: "",content: "",},rules: {title: [{ required: true, message: "请输入文章标题", trigger: "blur" }],description: [{ required: true, message: "请输入文章描述", trigger: "blur" },],img_url: [{ required: true, message: "请输入图片链接", trigger: "blur" },],seo_keyword: [{ required: true, message: "请输入 SEO 关键字", trigger: "blur" },],status: [{ required: true, message: "请输入展示状态", trigger: "blur" },],sort_order: [{ required: true, message: "请输入文章排序", trigger: "blur" },],category_id: [{ required: true, message: "请选择分类", trigger: "blur" },],content: [{ required: true, message: "请输入文章内容", trigger: "blur" },],},};},computed: {...mapState({adminInfo: (state) => state.admin.adminInfo,}),},mounted() {this.$axios = axios.create({ withCredentials: false });this.getUploadToken();this.getCategoryList();},methods: {// 获取上传tokenasync getUploadToken() {try {const res = await getToken();this.token = res.data.token;} catch (err) {console.log(err);}},// 上传图片成功回调handleUploadSuccess(file) {console.log("🚀 > handleUploadSuccess > file", file);this.ruleForm.img_url = `http://cdn.at-will.cn/${file.key}`;this.$message.success("上传成功!");},// 编辑器删除图片回调$imgDel(pos, $file) {console.log(pos, $file);},// 编辑器新增上传图片回调$imgAdd(pos, $file) {const loading = this.$loading({lock: true,text: "Loading",spinner: "el-icon-loading",background: "rgba(0, 0, 0, 0.7)",});// 第一步.将图片上传到服务器.const formdata = new FormData();formdata.append("file", $file);formdata.append("token", this.token);this.$axios({url: "https://upload-z0.qiniup.com/",method: "post",data: formdata,headers: { "Content-Type": "multipart/form-data" },}).then((res) => {const img_url = `http://cdn.at-will.cn/${res.data.key}`;this.$refs.md.$img2Url(pos, img_url);loading.close();}).catch((err) => {console.log(err);loading.close();});},// 获取分类列表async getCategoryList() {try {this.listLoading = true;const res = await list();this.categoryList = res.data.data;} catch (err) {console.log(err);} finally {this.listLoading = false;}},// 提交表单submitForm(formName) {if (this.adminInfo) {this.ruleForm.admin_id = this.adminInfo.id;}this.$refs[formName].validate(async (valid) => {if (valid) {this.createArticle();} else {console.log("error submit!!");return false;}});},// 重置表单resetForm(formName) {this.$refs[formName].resetFields();},// 创建文章async createArticle() {try {const res = await create(this.ruleForm);if (res.code === 200) {this.$msgbox.confirm("创建成功,是否退出创建文章页面", "提示", {confirmButtonText: "确定",cancelButtonText: "取消",type: "success",}).then(() => {this.$router.push("/article/index");});}} catch (err) {this.$message.error(err);}},},
};
</script><style scoped lang="scss">
.wrap {box-sizing: border-box;margin: 24px;
}
</style>
<style>
.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;
}
</style>

4. 七牛云配置域名

  1. 点击七牛cdn 域名管理
  2. 添加域名,并在域名管理解析
  3. 配置域名的 CNAME

域名解析一般要半个小时,解析完要等一下才生效
在这里插入图片描述

上传图片并访问

http://cdn.at-will.cn/Fp30TD1fiuyL00qyuGuiqQwo0hNI

完整代码

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel办公技巧:制作二级联动下拉菜单

分享制作二级联动下拉菜单的方法&#xff0c;即使数据有增删&#xff0c;菜单也能自动更新&#xff01; 可以通过先定义名称&#xff0c;再结合数据验证&#xff0c;来做二级联动下拉菜单。 1. 准备数据 首先&#xff0c;我们需要准备好要进行二级联动下拉菜单的数据&#xff…

PGCCC|【PostgreSQL】PCA+PCP+PCM等IT类认证申报个税退税指南

小编特将PostgreSQL证书申报个税退税流程&#xff0c;编辑成文&#xff0c;供大家申报参考哦~ 1.申报专项附加扣除 第一步&#xff1a;打开个人所得税APP&#xff0c;选择“专项附加扣除填报”&#xff1a; 第二步&#xff1a;“扣除年度”选择您要申报的年度&#xff0c;并…

韦东山嵌入式linux系列-具体单板的 LED 驱动程序

笔者使用的是STM32MP157的板子 1 怎么写 LED 驱动程序&#xff1f; 详细步骤如下&#xff1a; ① 看原理图确定引脚&#xff0c;确定引脚输出什么电平才能点亮/熄灭 LED ② 看主芯片手册&#xff0c;确定寄存器操作方法&#xff1a;哪些寄存器&#xff1f;哪些位&#xff1f;…

AI+折叠屏,荣耀的创新周期论

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024年&#xff0c;AI和折叠屏的演进路线&#xff0c;已经成为了手机行业的共识。 首先&#xff0c;手机市场的新增量已经被折叠屏所接管。据Counterpoint Research数据显示&#xff0c;中国2024年第一季度折叠屏手机销量同比增长…

怎样把视频压缩小一点 视频压缩工具

在数字媒体时代&#xff0c;视频文件的传输与分享已成为日常。然而&#xff0c;大视频文件往往给存储和分享带来诸多不便。如何将视频压缩到最小&#xff0c;同时保持画质和音质&#xff0c;成为了许多用户关注的焦点。本文将为你揭秘一系列高效的视频压缩方法&#xff0c;让你…

Linux离线安装Mysql5.7

Linux之Mysql安装配置 第一种&#xff1a;Linux离线安装Mysql&#xff08;提前手动下载好tar.gz包&#xff09; 第二种&#xff1a;通过yum安装配置Mysql&#xff08;服务器有网络&#xff09; 之前在阿里云上采用yum安装过一次&#xff08;请看这里&#xff09;&#xff0c;…

启智畅想火车类集装箱号码识别技术,软硬件解决方案

集装箱号码识别需求&#xff1a; 实时检测车皮号、火车底盘号码、集装箱号码&#xff0c;根据火车类型分为以下三种情况&#xff1a; 1、纯车皮&#xff0c;只检测车皮号&#xff1b; 2、火车拉货箱&#xff08;半车皮&#xff09;&#xff0c;检测车皮号集装箱号码&#xff1b…

算法力扣刷题记录 四十九【112. 路径总和】和【113. 路径总和ii】

前言 二叉树篇继续。 记录 四十九【112. 路径总和】和【113. 路径总和ii】 一、【112. 路径总和】题目阅读 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 target…

什么是边缘计算技术和边缘计算平台?

随着物联网、5G技术和人工智能的不断发展&#xff0c;数据的规模和种类也在快速增加。在这种背景下&#xff0c;传统的云计算模式面临着一些问题&#xff0c;例如延迟高、网络拥塞等&#xff0c;这些问题限制了数据的处理速度和效率&#xff0c;降低了用户的使用体验。为了解决…

Perl语言之数组

Perl数组可以存储多个标量&#xff0c;并且标量数据类型可以不同。   数组变量以开头。访问与定义格式如下&#xff1a; #! /usr/bin/perl arr("asdfasd",2,23.56,a); print "输出所有:arr\n"; print "arr[0]$arr[0]\n"; #输出指定下标 print…

【Quart 框架——来源于Flask的强大且灵活的异步Web框架】

目录 前言一、Quart简介1-1、简介1-2、与flask的区别 二、快速开始2-1、安装2-2、基本用法 三、核心功能3-1、异步路由3-2、WebSockets 支持3-3、中间件3-4、蓝图 (Blueprints) 四、部署4-1、使用uvicorn部署4-2、使用hypercorn部署 五、案例分析总结 前言 Quart 是一个基于 Py…

3.5、matlab打开显示保存点云文件(.ply/.pcd)以及经典点云模型数据

1、点云数据简介 点云数据是三维空间中由大量二维点坐标组成的数据集合。每个点代表空间中的一个坐标点&#xff0c;可以包含有关该点的颜色、法向量、强度值等额外信息。点云数据可以通过激光扫描、结构光扫描、摄像机捕捉等方式获取&#xff0c;广泛应用于计算机视觉、机器人…

排序——归并排序及排序章节总结

前面的文章中 我们详细介绍了排序的概念&#xff0c;插入排序&#xff0c;交换排序与选择排序&#xff0c;大家可以通过下面的链接再去学习&#xff1a; ​​​​​​排序的概念及插入排序 交换排序 选择排序 这篇文章就详细介绍一下另一种排序算法&#xff1a;归并排序以及…

NineData全面支持PostgreSQL可视化表结构设计

“PostgreSQL 是最像 Oracle 的开源关系型数据库“&#xff0c;也正因为如此&#xff0c;很多企业都青睐 PostgreSQL&#xff0c;拿它当成 Oracle 的替代品。所以毫无疑问&#xff0c;目前 PostgreSQL 在企业中非常常见。 对于直接接触 PostgreSQL 的开发人员而言&#xff0c;…

洛谷 P1056 [NOIP2008 普及组 T2]:排座椅 ← 贪心算法

【题目来源】https://www.luogu.com.cn/problem/P1056https://www.acwing.com/problem/content/436/【题目描述】 上课的时候总有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。 不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c…

算法2--贪心算法

1.老鼠和猫的交易 小老鼠准备了M磅的猫粮&#xff0c;准备去和看守仓库的猫做交易&#xff0c;因为仓库里有小老鼠喜欢吃的五香豆。 仓库有N个房间&#xff1b; 第i个房间有 J[i] 磅的五香豆&#xff0c;并且需要用 F[i] 磅的猫粮去交换&#xff1b; 老鼠不必交换该房间所有的五…

大数据技术基础

一、大数据平台 1.大数据平台方案步骤&#xff1a; ①市场上有哪些大数据平台 ②硬件、系统、业务增长等方面 ③方案是否通过 通过后&#xff1a;按照一期目标投入 先虚拟环境部署联系&#xff0c;再实际部署 《大数据架构介绍》《Hadoop架构解析》《Hadoop集群规划》 《H…

微信小程序毕业设计-汽车维修项目管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

ollama + fastgpt 搭建免费本地知识库

目录 1、ollama ollama的一些操作命令: 使用的方式: 2、fastgpt 快速部署: 修改配置: config.json: docker-compose.yml: 运行fastgpt: 访问OneApi: 添加令牌和渠道: 登陆fastgpt,创建知识库和应用 3、总结: 附录: 1. 11434是ollama的端口: 2. m3e 测…

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可以在前面加上反斜杠\ 例如在Java中当\出现时是转义字符的一部分&#xff0c;具有特殊意义&#xff0c;前面加一个反斜可以取消其特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个…