27
2017
09

七牛图片瘦身

一、将私有空间转换为空开空间

登录管理控制台,选择空间 => 空间设置 => 基本设置 => 防盗链

二、算法实现
基于时间戳防盗链的功能其实每家的CDN都是支持的。主要是通过使用约定的加密字符串来对具有访问有效期的资源链接进行一些加密计算的到一个sign值,然后访问外链里面带上这个sign和截止时间戳去访问CDN的节点,CDN的节点会用同样的算法来计算访问链接是否合法,如果不合法则返回403 Forbidden,否则返回所要访问的资源。

最终形成的访问外链是:http://if-pbl.qiniudn.com/golang.png?v=1&sign=xxxx&t=xxxx

1.工具类

package com.util;

import org.apache.commons.codec.binary.Hex;

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/** * @author xsx */
public class QiNiuAntiLeechUtil {
    /** * 生成资源基于CDN时间戳防盗链的访问外链 * @param url 资源原始外链 * @param durationInSeconds 结果资源的有效期,单位秒 * @throws MalformedURLException * @throws UnsupportedEncodingException * @throws NoSuchAlgorithmException */

    public static String getAntiLeechAccessUrlBasedOnTimestamp(String url, String encryptKey, int durationInSeconds)
            throws MalformedURLException, UnsupportedEncodingException, NoSuchAlgorithmException {
        URL urlObj = new URL(url);
        String path = urlObj.getPath();

        long timestampNow = System.currentTimeMillis() / 1000 + durationInSeconds;
        String expireHex = Long.toHexString(timestampNow);

        String toSignStr = String.format("%s%s%s", encryptKey, path, expireHex);
        String signedStr = md5ToLower(toSignStr);

        String signedUrl = null;
        if (urlObj.getQuery() != null) {
            signedUrl = String.format("%s&sign=%s&t=%s", url, signedStr, expireHex);
        } else {
            signedUrl = String.format("%s?sign=%s&t=%s", url, signedStr, expireHex);
        }

        return signedUrl;
    }

    private static String md5ToLower(String src) throws UnsupportedEncodingException, NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(src.getBytes("utf-8"));
        byte[] md5Bytes = digest.digest();
        return Hex.encodeHexString(md5Bytes);
    }
}

2.生成图片链接

/** * 获取图片url签名 * @param photoKey 七牛key * @return */
    public static String getUrlSign(String photoKey) {
        // cdn 配置的基于时间戳防盗链的加密字符串,cdn 配置完成后会得到
        String encryptKey = "";
        // 有效期
        int duration = 3600;
        // 待加密链接
        StringBuilder urlBuilder = new StringBuilder();
        //七牛图片域名
        urlBuilder.append("http://xxx.xxx.xxx");
        urlBuilder.append("/");
        //图片名
        urlBuilder.append(photoKey);
        String url = urlBuilder.toString();
        String urlSigned = null;
        try {
            //生成链接
            urlSigned = QiNiuAntiLeechUtil.getAntiLeechAccessUrlBasedOnTimestamp(url,encryptKey,duration);
            //imageslim图片瘦身
            urlSigned = urlSigned+"&imageslim";
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return urlSigned;
    }
上一篇:asp.net c# 打开新页面或页面跳转 下一篇:Android基于google-play-services-vision:8.1.0实现动态人脸检测