前言

本文首发于个人网站Jianger's Blog,欢迎访问订阅。个人博客小站刚建站不久,想着除了主题里的功能外再添加上相册模块,于是半搜索半摸索把相册模块搞出来了,最后采用了利用腾讯云对象存储作图床的方案,在国内速度也快,不用上传图片还来修改代码,只负责上传图片就好。我参考了以下博文给hexo静态博客添加动态相册功能。实现本模块需要两方面的设置:一是腾讯云对象存储;二是代码层添加相关页面;

腾讯云部分设置

腾讯云新用户使用对象存储每月有50G的免费额度,持续6个月。但是!不包括下行流量等其他消费,这只是存储额度,每月还是需要花点小钱的,对于个人博客来说花销不会很大。

  1. 登录腾讯云账号后选择菜单云产品->对象存储

  2. 点击使用,选择存储桶列表然后新建,输入名称,选择地域,其他一切默认就好

  3. 然后在存储桶里上传一些照片,此时复制访问域名到地址栏里看看是否可以访问(该访问域名代码层需要用到,很重要)

  4. 不出意外应该会如下图所示,因为没有设置相关权限,暂时无法直接访问

  5. 点击权限管理,然后如图所示选择添加即可,完成后再进行第三步操作应该没问题啦

  6. 最后再开启防盗链,这样别人就不能偷偷用你流量和图片还不用付钱啦,选择基础配置->防盗链设置进行编辑,如下图所示,重点是Referer,即只有这里填写的IP地址或域名才能使用,其他人无法访问

注意事项

  • 上传照片前,先在存储桶中建立一个文件夹,也就是你的相册名字,当然你也可以新建多个文件夹。
  • 但是有一点需要需要注意的是,不能直接上传一个文件夹,那样会出bug,见完文件夹后往里面上传照片,文件夹里面不能再新建文件夹了(除非你自己改造下面的相应代码)
  • 照片一定放在一个文件夹中,有文件夹又有单独的照片,相册是不会显示的(跟代码有关)

Jekyll配置

  1. 在项目里添加一个相册目录album,然后添加index.html(根据代码层次可能略有差异,不知道的话先去了解各个模块的功能吧)。

  2. 然后_config.yml配置文件中的菜单栏里也加上相册模块

  3. 在相册页面的index.html添加如下代码,其中JS代码是重点,页面布局可以看个人喜好啦:

    <style type="text/css">
             .main {
             padding-bottom: 150px;
             margin-top: 0px;
             }
             body {
                 background-size: 100%;
                 /*background-position: top left;*/
             }
             .imgbox{
              width: 100%;
              overflow: hidden;
             }
             .box{
                 visibility: visible;
                 overflow: auto;
                 zoom: 1;
             }
             .box li{
             float: left;
             width: 25%;
             position: relative;
             overflow: hidden;
             text-align: center;
             list-style: none;
             margin: 0;
             /*display: inline;*/
             padding: 0;
             }
             .box li span{
             display: block;
             font-size: 16px;
             font-weight: 600;
             font-family: fantasy;
             -webkit-box-sizing: border-box;
             box-sizing: border-box;
             }
             img.imgitem{
                 padding: unset;
                 padding: unset;
                 border: unset;
                 position: relative;
                 padding: 0px;
                 height: auto;
                 width: 100%;
             }
         .v{
             width: 95%;
             padding-top: 40px;
             margin: 0 auto;
         }
         div#posts.posts-expand {
             border: unset;
             padding: unset;
             margin-bottom: 10px;
         }
         .posts-expand .post-body img{
             padding: 12px !important;
         }
         .box p{
             display: block;
             font-size: 12px;
             font-family: 'SwisMedium';
             -webkit-box-sizing: border-box;
             box-sizing: border-box;
             text-align: center;
         }
         .box span strong{
             background: rgba(0,0,0,0.4);
             padding: 20px;
         }
         .posts-expand .post-title {
             display: none;
         }
         .title{
             width: 40%;
             margin: 0 auto;
             text-align: center;
         }
         .title h2{
             border: double;
             color: white;
             width: 70%;
             margin: 0 auto;
             background-color: tomato;
         }
         .title hr{
             height:2px;
         }
         .btn-more-posts{
             display: inline-block;
             vertical-align: middle;
             font: 85px/250px 'ChaletComprimeMilanSixty';
             color: #000;
             width: 100%;
             text-align: center;
             border: unset;
             height: 400px;
             background-color: #121212;
             -webkit-box-sizing: border-box;
             box-sizing: border-box;
         }
         @media (max-width: 767px){
             .box li {
             width: 100%;
         }
         .posts-expand .post-body img{
             padding: 0px !important;
         }
         .box span {
             border-right: unset;
             font-size: 17px;
         }
         .box p{
             border-right: unset;
             font-size: 12px;
    
         }
         .posts-expand {
             margin: unset;
         }
             div#comments.comments.v {
             width: 96%;
             padding-top: 50px;
         }
         }
         @media (min-width: 1600px){
             .container .main-inner{
                 width: 100%;
             }
         }
         .footer{
             background-color: #121212 !important;
         }
         .v .vwrap .vmark .valert .vcode {
             background: #00050b !important;
         }
         .nav>li {
             float: left;
         }
         .imgbox img{
             width: 95%;
         }
         .container-fluid a{
             border-bottom-style: none;
             color: #555;
         }
         </style>
         </head>
         <nav class="navbar navbar-default" role="navigation">
         <div class="container-fluid">
         <div class="navbar-header">
             <button type="button" class="navbar-toggle" data-toggle="collapse"
                     data-target="#example-navbar-collapse">
                 <span class="sr-only">切换导航</span>
                 <span class="icon-bar"></span>
                 <span class="icon-bar"></span>
                 <span class="icon-bar"></span>
             </button>
             <a class="navbar-brand" href="https://jiangsang.github.io/">Jianger's Blog</a>
         </div>
         <div class="collapse navbar-collapse" id="example-navbar-collapse">
             <ul class="nav navbar-nav">
                 <li><a href="https://jiangsang.github.io/"><i class="menu-item-icon fa fa-fw fa-home"></i>首页</a></li>
                 <li><a href="https://jiangsang.github.io/about"><i class="menu-item-icon fa fa-fw fa-user"></i>关于</a></li>
                 <li><a href="https://jiangsang.github.io/archives/"><i class="menu-item-icon fa fa-fw fa-archive"></i>归档</a></li>
                 <li><a href="https://jiangsang.github.io/tags/"><i class="menu-item-icon fa fa-fw fa-tags"></i>标签</a></li>
                 <li><a href="https://jiangsang.github.io/life/"><i class="menu-item-icon fa fa-fw fa-apple"></i>生活</a></li>
                 <li class="active"><a href="https://jiangsang.github.io/life/"><i class="menu-item-icon fa fa-fw fa-camera-retro"></i>相册</a></li>
             </ul>
         </div>
         </div>
     </nav>
         <div id="box" class="box"></div>
         <script type="text/javascript">
         function loadXMLDoc(xmlUrl)
         {
             try //Internet Explorer
             {
                 xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
             }
             catch(e)
             {
               try //Firefox, Mozilla, Opera, etc.
                 {
                   xmlDoc=document.implementation.createDocument("","",null);
                 }
               catch(e) {alert(e.message)}
             }
    
             try
             {
                   xmlDoc.async=false;
                   xmlDoc.load(xmlUrl);
             }
             catch(e) {
                 try //Google Chrome
                   {
                     var chromeXml = new XMLHttpRequest();
                     chromeXml.open("GET", xmlUrl, false);
                     chromeXml.send(null);
                     xmlDoc = chromeXml.responseXML.documentElement;
                     //alert(xmlDoc.childNodes[0].nodeName);
                     //return xmlDoc;
                   }
                   catch(e)
                   {
                       alert(e.message)
                   }
             }
             return xmlDoc;
         }
         //xmllink就是你的相册存储桶的访问域名
         xmllink="";
         xmlDoc=loadXMLDoc(xmllink);
         var urls=xmlDoc.getElementsByTagName('Key');
         var date=xmlDoc.getElementsByTagName('LastModified');
         var showNum=12; //每个相册一次展示多少照片
         if ((window.innerWidth)>1200) {wid=(window.innerWidth*3)/18;}
         var box=document.getElementById('box');
         var i=0;
         var content=new Array();
         var tmp=0;
         var kkk=-1;
         for (var t = 0; t < urls.length ; t++) {
             var bucket=urls[t].innerHTML;
             var length=bucket.indexOf('/');
             if(length===bucket.length-1){
                 kkk++;
                 content[kkk]=new Array();
                 content[kkk][0]={'url':bucket,'date':date[t].innerHTML.substring(0,10)};
                 tmp=1;
             }
             else {
                 content[kkk][tmp++]={'url':bucket.substring(length+1),'date':date[t].innerHTML.substring(0,10)};
             }
         }
         for (var i = 0; i < content.length; i++) {
             var conBox=document.createElement("div");
             conBox.id='conBox'+i;
             conBox.style='display: inline-block;';
             box.appendChild(conBox);
             var item=document.createElement("div");
             var title=content[i][0].url;
             item.innerHTML="<div class=title style=margin-top:20px;><h2>"+title.substring(0,title.length-1)+"</h2><hr/></div>";
             conBox.appendChild(item);
             for (var j = 1; j < content[i].length && j < showNum+1; j++) {
                 var con=content[i][j].url;
                 var item=document.createElement("li");
                 item.innerHTML="<div class=imgbox id=imgbox><img class=imgitem src="+xmllink+'/'+title+con+" alt="+con+"></div><span>"+con.substring(0,con.length-4)+"</span><p>上传于"+content[i][j].date+"</p>";
                 conBox.appendChild(item);
             }
             if(content[i].length > showNum){
                 var moreItem=document.createElement("button");
                 moreItem.className="btn-more-posts";
                 moreItem.id="more"+i;
                 moreItem.value=showNum+1;
                 let cur=i;
                 moreItem.onclick= function (){
                     moreClick(this,cur,content[cur],content[cur][0].url);
                 }
                 moreItem.innerHTML="<span style=display:inline;><strong style=color:#f0f3f6;>加载更多</strong></span>";
                 conBox.appendChild(moreItem);
             }
         }

    注意修改xmllink的访问域名为自己的,再往cos存储桶里上传照片,就可以了!访问后效果如下

    相册布局界面

    主题有默认布局,如果不想要在默认布局的基础上放置内容页面需要在layout文件下添加布局代码album.html,然后album目录下的index.html需要添加layout:album代码,意思便是使用album布局喽

    这个很重要,每个人喜好不同,花点时间打造成自己喜欢的相册空间吧!

如何利用腾讯云COS为静态博客添加动态相册的更多相关文章

  1. Hexo 博客快速整合gitalk组件,给静态博客添加动态评论功能!

    什么是 hexo-plugin-gitalk

  2. 利用腾讯云COS云对象存储定时远程备份网站

    版权声明:本文由张戈 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/942851001487125915 来源:腾云阁 h ...

  3. 在腾讯云上部署Hexo博客

    推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...

  4. 在腾讯云上面搭建WordPress博客网站

    一.准备工作 我们使用腾讯云服务器来运行WordPress,腾讯云会给新用户七天的产品体验时间还有一些代金券,做为新手尝试成本是比较小的. 腾讯云长期举办 "云+校园" 活动,学生 ...

  5. 在腾讯云上搭建WordPress博客

    笔者一直很羡慕那些搭建了个人博客的大牛,在最近工作之余也尝试着搭建了自己的博客,历时1周,这篇文章就将踩过的坑记录下来,先看下成果,链接在此 1- 购买腾讯云主机 腾讯云官网,我选了79元/月的最便宜 ...

  6. 腾讯云-搭建 WordPress 个人博客

    搭建 WordPress 个人博客 准备 LNMP 环境 任务时间:30min ~ 60min LNMP 是 Linux.Nginx.MySQL 和 PHP 的缩写,是 WordPress 博客系统依 ...

  7. 给Jekyll静态博客添加ScrollSpy博文大纲目录

    目录 内置TOC 添加ScrollSpy博文menu Scrollnav.js 使用方法❤ 最近又双叒把博客模板换成了Jekyll,Jekyll无论上手难度和修改难度都是目前所见流行模板中最低的(以无 ...

  8. Docsify+腾讯云对象存储 COS,一键搭建云上静态博客

    最近一直在想如何利用 COS 简化静态博客的搭建过程.搜了很多的静态博客搭建过程,发现大部分的静态博客都要通过编译才能生成静态页面.功夫不负有心人,终于让我找到了一个超简洁博客的搭建方法. 效果预览 ...

  9. 搭建markdown图床-腾讯云COS

    背景介绍 书写markdown笔记时,如何处理图片,实在是有些棘手的问题.每一张图都保存在当前文件夹? 每张图都自己重命名?每次上传到cnblogs博客都需要一张一张拖动?markdown已经非常成功 ...

随机推荐

  1. 2019-10-22-Roslyn-打包自定义的文件到-NuGet-包

    title author date CreateTime categories Roslyn 打包自定义的文件到 NuGet 包 lindexi 2019-10-22 19:45:34 +0800 2 ...

  2. Laravel Class config does not exist in

    修改了Laravel里面的.env文件之后报这个错误,找半天,找到罪魁祸首了,错误信息: Fatal error: Uncaught ReflectionException: Class config ...

  3. Python中多线程与多进程的恩恩怨怨

    概念: 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运 ...

  4. 10-2 body标签中相关的标签(字体标签,排版标签(div,span),超链接,图片标签)

    一 排版标签(div,span) 1块级标签 <!--div:把标签中的内容作为一个块儿来对待(division).必须单独占据一行.--> <!--div标签的属性:--> ...

  5. <肖申克的救赎>观后感

    肖申克的救赎主要讲述了银行家安迪在不健全的法律制度下被陷害进入了--鲨堡监狱,最后为了重见光明.追求自由,实现“自我救赎”的故事. 1.希望是件好东西,也许是世上最好的东西.好东西从来不会流逝. Ho ...

  6. 5 获取Form表单取值

    #form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和 POST 方式def data( ...

  7. 不插字段,直接利用OracleSpatial计算

    select to_char(regexp_replace(sdo_util.to_gmlgeometry(sdo_geom.sdo_difference( SDO_GEOMETRY ( 2003, ...

  8. 学习CSS预处理器Less

    1.Sass与Less的区别:Sass与Less的区别 2.Less的使用:Less的使用 3.Less的相关网址:Less.js.Less中文网 Less的HSL函数-lighten():HSL函数 ...

  9. git比较两个版本之间的区别

    查看当前没有add 的内容修改: git diff 查看已经add 没有commit 的改动 git diff --cached 查看当前没有add和commit的改动: git diff HEAD ...

  10. Python--day70--ORM多对多的三种方式