当前位置:   article > 正文

基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)

基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)

一个极简的Web图床应用,支持复制粘贴与拖拽上传图片

1.开发缘由

日常使用Vs Code编写markdown笔记与博客文章时,在文章中插入图片时发现非常不便

  • 使用本地文件编写相对路径---没法直接复制粘贴到其它地方
  • 使用第三方的图床---需要登录账号(还是放到自己"口袋"里放心)
  • vs code内置插件--- 诸多bug使用不方便
  • 喜欢折腾(真实)

2.效果预览

抛弃一切花里胡哨的,满足日常使用

静图

动图

点击体验一把

项目地址:github ,附有详细的食用指南,从0到1

3.手把手讲解代码核心部分

(1)如何获取复制粘贴的图片?

首先创建一个textarea获取粘贴/拖拽的内容,img展示复制/拖拽的图片

  1. <!-- 用于粘贴或拖拽图片 -->
  2. <textarea id="paste-panel"></textarea>
  3. <!-- 用于展示粘贴/拖拽的图片 -->
  4. <img id="img-panel" src="">

创建完毕后你可以看到的效果

接下来是书写js代码

  1. // 获取到对应的dom
  2. let $textarea = document.getElementById('paste-panel');
  3. let $img = document.getElementById('img-panel');
  4. /**
  5. * 绑定粘贴事件
  6. **/
  7. $textarea.addEventListener('paste', function(e) {
  8. // 组织触发默认的粘贴事件
  9. e.preventDefault();
  10. // 获取粘贴板中的内容
  11. let {
  12. items
  13. } = e.clipboardData;
  14. // 遍历获取到的items
  15. for (const item of items) {
  16. // 如果是文件对象且类型为图片
  17. if (item.kind === 'file' && item.type.includes('image')) {
  18. // 获取到文件对象
  19. let imgFile = item.getAsFile()
  20. // 将文件转成url
  21. let src = URL.createObjectURL(imgFile)
  22. // 展示生成的url
  23. $img.src = src;
  24. return;
  25. }
  26. }
  27. })

效果

(2)如何获取拖拽的图片?

基于刚才的html结构,让我们一起来书写js代码

  1. // 禁用默认的拖拽触发的内容(防止浏览器直接打开图片文件)
  2. document.addEventListener('drop', function(e) {
  3. e.preventDefault()
  4. })
  5. document.addEventListener('dragover', function(e) {
  6. e.preventDefault()
  7. })
  8. /**
  9. * 监听文件拖拽相关事件
  10. **/
  11. // 判断文件是否是拖拽进入了指定区域再释放
  12. let drag = false;
  13. // 拖拽进入
  14. $textarea.addEventListener('dragenter', function(e) {
  15. drag = true;
  16. })
  17. // 拖拽在区域里移动
  18. $textarea.addEventListener('dragover', function(e) {
  19. drag = true;
  20. });
  21. // 离开指定的区域
  22. $textarea.addEventListener('dragleave', function(e) {
  23. drag = false;
  24. })
  25. // 在指定的区域释放
  26. $textarea.addEventListener('drop', function(e) {
  27. if (drag) {
  28. // 获取拖拽的文件
  29. let {
  30. files
  31. } = e.dataTransfer;
  32. for (const file of files) {
  33. // 如果为图片文件则展示
  34. if (file.type.includes("image")) {
  35. // 将文件转成url
  36. let src = URL.createObjectURL(file)
  37. // 展示生成的url
  38. $img.src = src;
  39. return;
  40. }
  41. }
  42. }
  43. })

效果

关键的两个问题就这样解决了

(3) 如何上传到七牛云?

参考:qiniu-JavaScript-sdk文档

书写js方法(项目采用的webpack构建,所以这里是通过npm下载的qiniu-js-SDK依赖,也可以直接在页面中使用script标签引入qiniu-js-sdk的cdn资源)

  1. import * as qiniu from "qiniu-js";
  2. let Domain = 'bind-host' // 七牛云对象存储空间绑定的域名
  3. let observer = {
  4. next(res) {
  5. console.log(res);
  6. //上传进度
  7. let { percent } = res.total;
  8. },
  9. error(err) {
  10. console.log(err);
  11. },
  12. complete(res) {
  13. let { key } = res;
  14. // 完整的图片链接
  15. let completeUrl = `${Domain}/${key}`;
  16. }
  17. }
  18. /**
  19. * 文件上传
  20. * @param {Blob|File} file
  21. * @param {String} filename
  22. **/
  23. function uploadFile(file, filename) {
  24. // 上传配置
  25. let putExtra = {
  26. fname: filename,// 文件名称
  27. params: {},
  28. mimeType: null // 文件类型(null:系统自动识别)
  29. };
  30. // 上传用户平凭据
  31. let token = 'xxxxx....';
  32. // config
  33. let config = {
  34. useCdnDomain: true,// 是否使用cdn加速
  35. region: qiniu.region.z0
  36. //选择上传域名区域;当为 null 或 undefined 时,
  37. //自动分析上传域名区域,我是选择的华东所以是z0
  38. }
  39. }
  40. // token 上传身份验证秘钥
  41. let observable = qiniu.upload(file, filename, token, putExtra, config)
  42. // 配置回调函数
  43. observable.subscribe(observer)
  44. }

(4) 如何生成用户上传凭据token?

这里使用node.js去生成

参考qiniu-nodejs-sdk文档

书写js

  1. const qiniu = require('qiniu')
  2. const fs = require('fs');
  3. // 七牛账号下的一对有效的Access Key和Secret Key
  4. // 对象存储空间名称 bucket
  5. let accessKey = 'xxxx',
  6. secretKey = 'xxx',
  7. bucket = 'xxxx';
  8. //鉴权对象
  9. let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
  10. let options = {
  11. scope: bucket,
  12. expires: 60 * 60 * 24 * 7 //这里设置的7天,token过期时间(s(秒))
  13. };
  14. let putPolicy = new qiniu.rs.PutPolicy(options);
  15. let uploadToken = putPolicy.uploadToken(mac);
  16. // 将获取的token生成写入到token.txt中
  17. fs.writeFileSync("./token.txt", uploadToken);
图片解释 1. 对象存储空间名称 bucket www.wityx.com 2.Access Key和Secret Key www.wityx.com www.wityx.com

书写完成后运行token.js

node token.js

同级目录下生成token.txt文件,里面的内容即为所需的用户凭据

综上

利用上述所提到的知识即可搭建出这个简易的基于七牛云的web图床

4. 最后附上参考资料链接与项目github地址

参考文档

1. qiniu-JavaScript-sdk文档

2. qiniu-nodejs-sdk文档

项目地址

我的Github

项目地址:https://github.com/ATQQ/image-bed-qiniu

体验地址:https://picker.sugarat.top/

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号