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

摘要:
一个极简的Web图床应用,支持复制粘贴与拖拽上传图片1.开发缘由日常使用VsCode编写markdown笔记与博客文章时,在文章中插入图片时发现非常不便使用本地文件编写相对路径---没法直接复制粘贴到其它地方使用第三方的图床---需要登录账号vscode内置插件---诸多bug使用不方便喜欢折腾(真实)2.效果预览抛弃一切花里胡哨的,满足日常使用静图动图点击体验一把项目地址:github,附有详细的食用指南,从0到13.手把手讲解代码核心部分如何获取复制粘贴的图片?

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

1.开发缘由

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

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

2.效果预览

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

静图

图片

动图

图片

点击体验一把

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

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

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

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

<!-- 用于粘贴或拖拽图片 -->
<textarea id="paste-panel"></textarea>
<!-- 用于展示粘贴/拖拽的图片 -->
<img   src="https://tool.4xseo.com/article/72184.html">

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

图片

接下来是书写js代码

// 获取到对应的dom
let $textarea = document.getElementById('paste-panel');
let $img = document.getElementById('img-panel');

/**
 * 绑定粘贴事件
 **/
$textarea.addEventListener('paste', function(e) {
    // 组织触发默认的粘贴事件
    e.preventDefault();
    // 获取粘贴板中的内容
    let {
        items
    } = e.clipboardData;

    // 遍历获取到的items
    for (const item of items) {
        // 如果是文件对象且类型为图片
        if (item.kind === 'file' && item.type.includes('image')) {
            // 获取到文件对象
            let imgFile = item.getAsFile()
            // 将文件转成url
            let src = URL.createObjectURL(imgFile)
            // 展示生成的url
            $img.src = src;
            return;
        }
    }
})

效果

图片

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

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

// 禁用默认的拖拽触发的内容(防止浏览器直接打开图片文件)
document.addEventListener('drop', function(e) {
    e.preventDefault()
})
document.addEventListener('dragover', function(e) {
    e.preventDefault()
})

/**
 * 监听文件拖拽相关事件
 **/
// 判断文件是否是拖拽进入了指定区域再释放
let drag = false;

// 拖拽进入
$textarea.addEventListener('dragenter', function(e) {
    drag = true;
})

// 拖拽在区域里移动
$textarea.addEventListener('dragover', function(e) {
    drag = true;
});

// 离开指定的区域
$textarea.addEventListener('dragleave', function(e) {
    drag = false;
})

// 在指定的区域释放
$textarea.addEventListener('drop', function(e) {
    if (drag) {
        // 获取拖拽的文件
        let {
            files
        } = e.dataTransfer;
        for (const file of files) {
            // 如果为图片文件则展示
            if (file.type.includes("image")) {
                // 将文件转成url
                let src = URL.createObjectURL(file)
                    // 展示生成的url
                $img.src = src;
                return;
            }
        }
    }
})

效果

图片

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

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

参考:qiniu-JavaScript-sdk文档

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

import * as qiniu from "qiniu-js";
let Domain = 'bind-host' // 七牛云对象存储空间绑定的域名
let observer = {
    next(res) {
        console.log(res);
        //上传进度
        let { percent } = res.total;
    },
    error(err) {
        console.log(err);
    },
    complete(res) {
        let { key } = res;
        // 完整的图片链接
        let completeUrl = `${Domain}/${key}`;
    }
}

/**
 * 文件上传
 * @param {Blob|File} file
 * @param {String} filename
 **/
function uploadFile(file, filename) {
    // 上传配置
    let putExtra = {
        fname: filename,// 文件名称
        params: {},
        mimeType: null // 文件类型(null:系统自动识别)
    };

    // 上传用户平凭据
    let token = 'xxxxx....';
    // config
    let config = {
        useCdnDomain: true,// 是否使用cdn加速
        region: qiniu.region.z0
        //选择上传域名区域;当为 null 或 undefined 时,
        //自动分析上传域名区域,我是选择的华东所以是z0
        }
    }
    // token 上传身份验证秘钥
    let observable = qiniu.upload(file, filename, token, putExtra, config)

    // 配置回调函数
    observable.subscribe(observer)
}

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

这里使用node.js去生成

参考qiniu-nodejs-sdk文档

书写js

const qiniu = require('qiniu')
const fs = require('fs');

// 七牛账号下的一对有效的Access Key和Secret Key
// 对象存储空间名称 bucket
let accessKey = 'xxxx',
    secretKey = 'xxx',
    bucket = 'xxxx';

//鉴权对象
let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);

let options = {
    scope: bucket,
    expires: 60 * 60 * 24 * 7 //这里设置的7天,token过期时间(s(秒))
};

let putPolicy = new qiniu.rs.PutPolicy(options);
let uploadToken = putPolicy.uploadToken(mac);

// 将获取的token生成写入到token.txt中
fs.writeFileSync("./token.txt", uploadToken);
图片解释 1. 对象存储空间名称 bucket 基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)第6张 2.Access Key和Secret Key 基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)第7张基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)第8张

书写完成后运行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://imgbed.sugarat.top/

免责声明:文章转载自《基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CentOs如何挂载硬盘(手把手教你 )干货:数据库分库分表基础和实践下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

EhCache缓存的使用

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。   我们使用EhCache缓存框架主要是为了判断重复Url,每次爬取一个网页,都把Url存储到缓存中,并且每次爬某个网页之前,都去缓存中搜索下,假如存在的话,我们就不要爬取这个网页了,不存在的话,我们就爬下网页,爬取成功后,把这...

java学习--基础知识进阶第六天--集合&amp;amp;迭代器、增强for &amp;amp; 泛型、常见数据结构、List子体系

今日内容介绍 u  集合&迭代器 u  增强for & 泛型 u  常见数据结构 u  List子体系 第1章 集合&迭代器 1.1 集合体系结构 1.1.1 集合体系图      在最顶层的父接口Collection中一定定义了所有子类集合的共同属性和方法,因此我们首先需要学习Collection中共性方法,然后再去针对每个子类集...

容器知识的重点总结

什么是容器 数组也是一种容器,可以存放对象或基本数据类型,数组的劣势在于不灵活,容器需要事先定义好,不能随着需求而改变而扩容。而容器则可以随时扩容来装对象,容器也称为集合。 容器的结构 单例集合 将数据一个一个的进行存储 双例集合 基于 key 和 value 的结构存储数据 Collection 接口 LIst接口:有序,可重复 ArrayList 容...

阿里云对象存储OSS与文件存储NAS的区别

一、简介 应用场景:选择一款存储产品,面向文档数据的存取,不会涉及到数据处理。 产品选型主要从OSS和NAS中选择一款,满足文档存储的需求。 二、NAS优缺点 NAS 是一种采用直接与网络介质相连的特殊设备实现数据存储的机制。由于这些设备都分配有 IP 地址,所以客户机通过充当数据网关的服务器可以对其进行存取访问,甚至在某些情况下,不需要任何中间介质...

Lustre I/O性能特点与最佳实践 刘爱贵的专栏 博客频道 CSDN.NET

Lustre I/O性能特点与最佳实践 - 刘爱贵的专栏 - 博客频道 - CSDN.NET Lustre I/O性能特点与最佳实践 分类:计算机理论数据存储GNU/LINUX2011-05-30 22:369058人阅读评论(34)收藏举报 1 Lustre概述Lustre是面向集群的存储架构,它是基于Linux平台的开源集群(并行)文件系...

阿里云对象存储服务,OSS使用经验总结,图片存储,分页查询

阿里云OSS-使用经验总结,存储,账号-权限,分页,缩略图,账号切换 最近项目中,需要使用云存储,最后选择了阿里云-对象存储服务OSS。总的来说,比较简单,但是仍然遇到了几个问题,需要总结下。1.OSS总的使用介绍  https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object...