Toc
  1. 前言
  2. 开发
    1. 新建项目:
    2. 一键上传
    3. 打包
  • 服务器安装JDK
  • 自定义命令
  • END
  • Toc
    0 results found
    Dark
    一键上传hexo文件到阿里云OSS-第二版

    前言

    2020-08-12 更新:阿里云更新了OSS自动刷新CDN,比以前刷新更快更准了,不需要代码实现手动刷新了

    hexo作为一个静态博客,可以完全不需要服务器运行,所以我选择挂载在阿里云的OSS(对象存储)中,开启静态托管,再配合CDN(全站加速),实现高速访问。
    如果对此不了解,可以先看看这篇使用阿里云sdk将hexo生成的博客上传至阿里云OSS并启CDN全站加速

    上面这篇博客最后使用阿里云的SDK写了一个JS轮子,实现一键把生成的public文件上传到OSS,听起来很方便,但用了两个月后,发现了一些问题:

    • 代码太简陋,只有一个for循环
    • 只支持简单上传,每次都把整个文件夹全全部上传一遍
    • 文件越来越多,体积越来越大,上传的东西多了,自然就会越来越慢
    • 每次都要覆盖OSS原来的文件,即使这个文件没有做任何的修改

    综上所述,这样的轮子是不符合我们的预期要求的,于是我决定重新打造轮子,但这次用的是java实现





    开发



    新建项目:

    还是使用我熟悉的IDEA(jb家的软件还是很香的)

    1. IDEA创建项目

      • File-New-Project

      选择Maven-Next-Finsh

    2. 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>
    <!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly-->
    <executions>
    <execution>
    <id>make-assemble</id>
    <phase>package</phase>
    <goals>
    <goal>single</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>

    1. 创建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"是你hexo生成博客文件的相对路径
    getFiles("./public");
    }


    public static void getFiles(String path) throws IOException {

    // Endpoint是OSS的仓库地区URL,请按实际情况填写,***一般填OSS所在地区的地名拼音,如"hangzhou","shenzhen"等
    String endpoint = "http://oss-cn-***.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    String accessKeyId = "***";
    String accessKeySecret = "***";
    //bucket填你的bucket名称
    String bucket = "***";

    // 创建OSSClient实例。
    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 {
    //优化上传到OSS的文件名,否则上传到OSS后文件路径会有问题
    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");

    // 查询OSS是否有与本地重名的文件
    final int maxKeys = 1;
    ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucket).withPrefix(OSSfiles));
    List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
    //查询有重名则赋值到"OSSfile"
    String OSSfile=new String();
    for (OSSObjectSummary s : sums) {
    OSSfile = s.getKey();
    }

    if (OSSfile.equals(OSSfiles)){
    //重名则执行以下

    System.out.println("\033[33;2m"+"文件已存在,验证MD5"+"\033[0m");

    // 获取OSS文件的Etag。
    SimplifiedObjectMeta objectMeta = ossClient.getSimplifiedObjectMeta(bucket, OSSfiles);
    String Etag = objectMeta.getETag();
    System.out.println("\033[37;2m"+"Etag值:" + Etag+"\033[0m");

    //计算本地文件md5值
    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 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 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。
    ossClient.shutdown();
    }
    }






    打包

    代码复制进去之后,保存,打包即可

    1. 打开Maven(在你的IDE的最右边)

    2. 运行package,等待打包完成

    3. 打包好的jar包在target文件夹里(是文件名长的那个)

    4. 试运行一下

      (报错如图所示是正常的,因为路径对于windows来说是不正确的)

    如果不是报别的错误,就可以把jar包上传到你的服务器了(请把jar包放在public文件夹的上一层文件夹)

    虽然说我的博客托管在OSS上,不需要运行在服务器上,但我的hexo生成器还是放在服务器上的,如果你是放在windows上,请自行理解代码并修改,这里就不再阐述了
    代码写的比较菜,如有问题和建议,请大佬们不吝批评~





    服务器安装JDK

    使用java,必不可少的当然是JDK,服务器安装JDK非常简单

    我用的是centos,一般来说只需三步:

    1. 查看yum包含的JDK版本

      yum list java*
    2. 安装JDK
      一般选择安装java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment

      yum install java-1.8.0-openjdk-devel.x86_64

    3. 配置全局变量
      打开配置文件,按i编辑

      vi /etc/profile

      复制以下三行代码,按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

      使全局变量生效

      source /etc/profile

      查看安装是否成功

      java -version





    自定义命令

    jar包上传好了,JDK装好了,就可以一条命令实现上传了

    java -jar ***.jar

    但每次上传都需要输入:”java -jar ***.jar”,太麻烦了,所以我决定做一个自定义命令

    1. 编辑bashrc

      vi /etc/bashrc

    2. 添加命令
      按i进入编辑模式
      在文件底部添加:
      alias (自定义命令)=’(原命令)’
      如:

      //例:
      alias uposs='java -jar SendToOSS.jar'

      按esc退出编辑模式,输入:wq保存文件

    3. 使配置文件生效

      source /etc/bashrc

    4. 输入命令alias即可获取自定义过的命令

    5. 输入你自定义的命令即可运行,如:





    END

    本文作者:Dark
    版权声明:本文首发于Dark的博客,转载请注明出处!