前言
2020-08-12 更新:阿里云更新了OSS自动刷新CDN,比以前刷新更快更准了,不需要代码实现手动刷新了
hexo作为一个静态博客,可以完全不需要服务器运行,所以我选择挂载在阿里云的OSS(对象存储)中,开启静态托管,再配合CDN(全站加速),实现高速访问。
如果对此不了解,可以先看看这篇使用阿里云sdk将hexo生成的博客上传至阿里云OSS并启CDN全站加速
上面这篇博客最后使用阿里云的SDK写了一个JS轮子,实现一键把生成的public文件上传到OSS,听起来很方便,但用了两个月后,发现了一些问题:
- 代码太简陋,只有一个for循环
- 只支持简单上传,每次都把整个文件夹全全部上传一遍
- 文件越来越多,体积越来越大,上传的东西多了,自然就会越来越慢
- 每次都要覆盖OSS原来的文件,即使这个文件没有做任何的修改
综上所述,这样的轮子是不符合我们的预期要求的,于是我决定重新打造轮子,但这次用的是java实现
开发
新建项目:
还是使用我熟悉的IDEA(jb家的软件还是很香的)
IDEA创建项目
选择Maven-Next-Finsh
Maven导包
打开pom.xml
- 我们要用到的包主要是”aliyun-sdk-oss”
- 由于我还要使用SDK刷新CDN,所以还需要用到”aliyun-java-sdk-cdn”
- 下面给出配置,直接复制就好了(配置还包含了打包工具)
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.4.3</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-cdn</artifactId> <version>3.0.10</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.test.app.SendToOSS</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assemble</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
|
- 创建Java Class
- 在src-main-java里创建Package:”com.test.app”
- 在文件夹里创建Java Class:”SendToOSS.java”
一键上传
开发需求:
- 查询一个文件夹下的所有文件,如果是文件夹,继续递归查询
- 查询OSS里是否有同名文件,有则验证,无则直接上传
- 查询本地文件的MD5值,查询OSS里同名文件的Etag值
- 验证MD5和Etag值是否相同,值相同则不覆盖,不相同则覆盖上传
代码如下:
“***”为需要自己填写的参数
注释基本都有解释
SendToOSS.java
package com.test.app;
import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import org.apache.commons.codec.digest.DigestUtils; import java.io.*; import java.util.List;
public class SendToOSS {
public static void main(String[] args) throws IOException { getFiles("./public"); }
public static void getFiles(String path) throws IOException {
String endpoint = "http://oss-cn-***.aliyuncs.com"; String accessKeyId = "***"; String accessKeySecret = "***"; String bucket = "***";
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
File file = new File(path); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { getFiles(files[i].getPath()); } else { String OSSfiles = files[i].getPath().substring(9);
System.out.println(""); System.out.println(""); System.out.println("-----------------------------------"); System.out.println("\033[32;2m"+"Begin to Upload file:" +"\033[35;1m"+ OSSfiles+"\033[0m"); final int maxKeys = 1; ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucket).withPrefix(OSSfiles)); List<OSSObjectSummary> sums = objectListing.getObjectSummaries(); String OSSfile=new String(); for (OSSObjectSummary s : sums) { OSSfile = s.getKey(); }
if (OSSfile.equals(OSSfiles)){
System.out.println("\033[33;2m"+"文件已存在,验证MD5"+"\033[0m");
SimplifiedObjectMeta objectMeta = ossClient.getSimplifiedObjectMeta(bucket, OSSfiles); String Etag = objectMeta.getETag(); System.out.println("\033[37;2m"+"Etag值:" + Etag+"\033[0m");
String filemd5 = DigestUtils.md5Hex(new FileInputStream(files[i].getPath())); String fileMD5 = filemd5.toUpperCase(); System.out.println("\033[37;2m"+"文件MD5值:" + fileMD5+"\033[0m");
if (Etag.equals(fileMD5)) { System.out.println("\033[33;2m"+"文件一致,不覆盖"+"\033[0m"); } else { System.out.println("\033[32;2m"+"不一致,上传文件"+"\033[0m"); PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, OSSfiles, new File(files[i].getPath())); ossClient.putObject(putObjectRequest); System.out.println("\033[34;1m"+"Upload done,Succeeded!"+"\033[0m"); } } else if (OSSfile != OSSfiles){
System.out.println("\033[32;2m"+"File not found,Upload begin"+"\033[0m"); PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, OSSfiles, new File(files[i].getPath())); ossClient.putObject(putObjectRequest); System.out.println("\033[34;1m"+"Upload done,Succeeded!"+"\033[0m"); } else { System.out.println("\033[31;1m"+"Upload Faild,please check ,,Ծ‸Ծ,,"+"\033[0m"); } } } ossClient.shutdown(); } }
|
打包
代码复制进去之后,保存,打包即可
打开Maven(在你的IDE的最右边)
运行package,等待打包完成
打包好的jar包在target文件夹里(是文件名长的那个)
试运行一下
(报错如图所示是正常的,因为路径对于windows来说是不正确的)
如果不是报别的错误,就可以把jar包上传到你的服务器了(请把jar包放在public文件夹的上一层文件夹)
虽然说我的博客托管在OSS上,不需要运行在服务器上,但我的hexo生成器还是放在服务器上的,如果你是放在windows上,请自行理解代码并修改,这里就不再阐述了
代码写的比较菜,如有问题和建议,请大佬们不吝批评~
服务器安装JDK
使用java,必不可少的当然是JDK,服务器安装JDK非常简单
我用的是centos,一般来说只需三步:
查看yum包含的JDK版本
安装JDK
一般选择安装java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment
yum install java-1.8.0-openjdk-devel.x86_64
|
配置全局变量
打开配置文件,按i编辑
复制以下三行代码,按esc退出编辑模式,输入:wq 保存退出
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el6_9.x86_64 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
|
使全局变量生效
查看安装是否成功
自定义命令
jar包上传好了,JDK装好了,就可以一条命令实现上传了
但每次上传都需要输入:”java -jar ***.jar”,太麻烦了,所以我决定做一个自定义命令
编辑bashrc
添加命令
按i进入编辑模式
在文件底部添加:
alias (自定义命令)=’(原命令)’
如:
//例: alias uposs='java -jar SendToOSS.jar'
|
按esc退出编辑模式,输入:wq保存文件
使配置文件生效
输入命令alias即可获取自定义过的命令
输入你自定义的命令即可运行,如:
END
版权声明:本文首发于
Dark的博客,转载请注明出处!