IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 《基于Vue和七牛云开发的简易个人图床系统》 -> 正文阅读

[JavaScript知识库]《基于Vue和七牛云开发的简易个人图床系统》

初看这个标题是不是很像论文题目?是的,最近在被毕业论文搞魔怔了哈哈,想着找点其他事情干缓解一下。

恰好最近苦于写笔记没法上传图片(之前使用某云作为图床,但现在某云关闭了这项功能),就想着做个个人图床玩玩(看到最后就知道为什么是“玩玩”了)。很快啊,立马开工。

技术栈选择

  • Vue.js + ElementUI
  • Express
  • 七牛云

准备工作

做这个个人图床之前,首先需要有一个七牛云的账号,同时需要进行七牛云的相关配置。包括:

  • 七牛云账号
  • 一个可用的七牛云空间
  • 最好有一个已备案的域名(设置CNAME),如果没有,可以用七牛云提供的测试域名代替
  • 七牛云Javascript开发文档

开冲

上面那些工作准备好后,就可以直接开冲。

整体流程是这样的:

image-20220423152759121

看起来是挺简单的,那就一步一步来完成。

后端进行配置,获取七牛云token

在获取token之前,需要获取七牛云的accessKeysecretKey。这两个参数一般在个人中心-->密钥管理可以查看。

image-20220423183256268

接着,后台服务安装好qiniu依赖包:

npm install qiniu -S

利用七牛提供的API完成token的获取:

const express = require('express')
const qiniu = require('qiniu')
const router = express.Router()
router.use(express.json())

// 七牛相关配置
const accessKey = 'Vl7pEPxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxIaqs'
const secretKey = '6Z1QIZxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyLJF'
const options = {
  scope: 'yanwuhc' // 存储空间的名字
}

// 获取配置接口
router.get('/getConfig', (req, res) => {
  const mac = new qiniu.auth.digest.Mac(accessKey, secretKey)
  const putPolicy = new qiniu.rs.PutPolicy(options)
  const uploadToken = putPolicy.uploadToken(mac)
  res.status(200).send({
    code: 1,
    msg: 'success',
    data: {
      token: uploadToken
    }
  })
});

module.exports = router

前端进行文件上传

前端需要先安装qiniu-js依赖:

npm install qiniu-js -S

同时,在Vue文件中引入:

// index.vue
import * as qiniu from 'qiniu-js'

首先,前端通过node后台提供的接口获取七牛云的token。

// 获取七牛云配置
async getQiniuConfig() {
    const { data: { token } } = await this.$_api.getQiniuConfig()
    this.token = token
}

接着便是上传处理,用一个按钮来模拟一个input[type=“file”]的行为动作,当点击这个按钮的时候,触发上传文件动作。

<button @click="uploadPictrues">上传图片</button>
<input style="display: none" type="file" id="file" ref="file" @click="e => {e.target.value = '';}" @change="uploadFile">

相关的逻辑如下:

uploadPictures触发input[type=“file”]的上传事件,当input[type=“file”]元素的值改变的时候,触发uploadFile,即将文件上传到七牛云。

const QINIU_BASE_PATH = 'http://qiniu.cdn.yanwuhc.cn' // 七牛云配置CNAME使用的那个域名地址
......
uploadPictrues() {
    this.$refs.file.dispatchEvent(new MouseEvent('click'))
},    	
// 上传到七牛云 - 具体实例
async uploadFile() {
	const file = this.$refs.file.files[0]
	this.uploadToQiniu(file).then(res => {
        const { key } = res  // key是从七牛云服务返回的文件名字
        this.url = QINIU_BASE_PATH + key 
        this.filename = file.name
        this.$notify.success({
            title: '成功',
            message: '上传成功!'
        })
	})
}

uploadToQiniu是利用七牛云关于JavaScript的API封装的方法,如下所示:

uploadToQiniu(file, putExtra = {}, key=undefined) {
  const token = this.token
  // 七牛云的一些配置,region需要根据你的空间地区来选择,像我这里z2表示华南地区
  const config = {
    useCdnDomain: true,
    region: qiniu.region.z2
  };
  const observable = qiniu.upload(file, key, token, putExtra, config)
  return new Promise((resolve, reject) => {
    observable.subscribe(this.handleCallback(resolve, reject))
  })
},
handleCallback(resolve, reject) {
  return {
    next(res) {},
    error(error) {
      reject(error)
    },
    complete(res) {
      resolve(res)
    }
  }
}

文字转化与粘贴

  • 用computed生成所需要的markdown格式链接
markdown() {
    if (this.filename && this.url) {
        return `![${this.filename}](${this.url})`
    } else {
        return '请选择上传图片'
    }
}
  • 使用clipboard.js来完成复制黏贴动作。
<el-form inline label-width="80px">
    <el-form-item label="markdown">
        <el-input v-model="markdown" />
    </el-form-item>
    <el-form-item>
        <el-button type="primary" class="copy-md" @click="copyItem">复制</el-button>
    </el-form-item>
</el-form>
copyItem () {
    let clipboard = new Clipboard ('.copy-md', {
        text: () => {
            return this.markdown
        }
    })
    clipboard.on('success', () => {
        this.$notify({
            type: 'success',
            title: '成功',
            message: '复制成功!'
        });
        clipboard.destroy()
    })
    clipboard.on('error', () => {
        this.$notify({
            type: 'error',
            title: '成功',
            message: '复制成功!'
        });
        clipboard.destroy()
    })
}

效果预览

后面自己加了图片预览、复制URL等功能,效果如下:

image-20220423190754367

markdown链接有效:

![微信图片_20220422161445.jpg](http://qiniu.cdn.yanwuhc.cn/FosTszz6nttLXCDNCawqzGUeYzuW)

最后

最后,当我想把这个个人图床部署上线的时候,发现原来Typora+Picgo+七牛云原来已经可以完成图片的自动上传了!!那我这个图床做了出来,貌似没有什么意义了?因为Typora已经可以实现自动上传图片,而上面完成的系统还需要人工手动上传,在效率上就已经落入下风了。

所以,真就只能当”做个个人图床玩玩“。

后来突然想起,去年有位师兄叫我做一个上传文件的功能,也是基于七牛云的。但那时候对自己技术的不自信,就推辞了。如今做完这个图床系统,不禁感慨,这不就是当时师兄想要我做的那个系统吗。

确实是时间在改变,人也在成长啊(偷笑)。尽管这个系统没有上线作为个人使用,但也是自己的一种开发实践吧。

不吹了,继续写论文= =。
u=1338103272,2195591972&fm=253&fmt=auto&app=120&f=GIF.gif

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:20:29  更:2022-04-24 09:20:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:05:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码