使用七牛云存储实现图片API,自动删除图片方案合集
七牛图片处理API使用背景
本站有几个工具是采用 七牛云 存储图片API实现的。主要为图片周边,如:图片格式转换、图片压缩、图片信息读取等API。
图片尺寸修改:https://www.sojson.com/image/change.html
图片格式转换:https://www.sojson.com/image/format.html
图片批量压缩:https://www.sojson.com/image/compress.html
图片信息查看:https://www.sojson.com/image/info.html
等等... ...
但是遭到有人恶意使用我们的工具,先上传图片,然后获取图片地址,然后就直接拿着我们的图片去做使用,导致我们 七牛云 存储的 CDN 流量异常的高,而且是居高不下。
本来可以用防盗链 + 不允许空的来源链接来解决,但是对我们工具来讲会有一些影响,所以没办法,只好想一些办法来解决。
解决方案
可能很多人了解的话,知道七牛有一个生命周期,我也已经设置了1天,但是生命周期只能以天为单位,也就是用户上传了文件,在不主动干预的情况下,基本上会存储到24小时左右。
1.七牛云存储本身有比较完善的API,可以对文件有一个防盗链的API。具体可以看看这个链接:https://developer.qiniu.com/fusion/kb/1670/timestamp-hotlinking-prevention
2.使用后删除,当用户上传后,做系列操作,最后有一个完成操作的场景下,这时候可以调用删除文件API,来删除文件。
3.主动去读取七牛云存储空间,然后去根据时间删除。
我采纳的方案,由于方案1稍微有点复杂,方案2对我不合适,我采用了方案3,主动去读取列表,然后判断时间是否超过一定的时间,再删除。
解决代码 4 Java
这里采用Java解决的,稍微示例一下代码:
1.定时任务,6分钟扫描一次,根据自己的业务做具体时间设置。
//采用一个定时任务,6分钟执行一次
@Scheduled(cron = "0 */6 * * * ?")
public void sysDeleteQiniuFile(){
DeleteManager.getByPrifix("空间名称","",100);
}
2.获取列表文件,读取上传时间比较后删除
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import com.sojson.domain.html.common.DateUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
@Slf4j
public class DeleteManager {
static Auth auth = Auth.create( accessKey, secretKey);
/**
* 根据前缀删除
* @param bucket 空间
* @param prefix 前缀
* @param limit 多少条 每次迭代的长度限制,最大1000,推荐值 1000
* @return
*/
public static void getByPrifix(String bucket, String prefix, int limit) {
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
BucketManager bucketManager = new BucketManager(auth, cfg);
//指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
String delimiter = "";
//列举空间文件列表
BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);
while (fileListIterator.hasNext()) {
//处理获取的file list结果
FileInfo[] items = fileListIterator.next();
for (FileInfo item : items) {
String key = item.key;
long putTime = item.putTime / 10000;
Date now = new Date();
long stime = now.getTime() - putTime;
long min = stime / 1000 / 60;
log.info("上传时间:{},现在时间:{}",DateUtil.dateToString(new Date(putTime),"yyyy-MM-dd HH:mm") ,DateUtil.dateToString(now,"yyyy-MM-dd HH:mm") );
//计算时间相差五分钟就删除
if(min > 5){
log.info("相差5分钟,开始删除:{}",key );
try {
Response res = bucketManager.delete(bucket, key);
log.info("删除文件:[{}]:{}", res.statusCode,key);
} catch (QiniuException e) {
log.info("删除失败:{}",key);
}
}
}
}
}
}
这里要注意2个问题。
1.accessKey, secretKey这个您登录七牛账号,鼠标移动到头像,有一个秘钥管理中可以取到,链接为:https://portal.qiniu.com/user/key。
2.Zone.zone0() 问题,您要搞清楚您的空间在哪个区域,也可以直接 Zone.autoZone() 。
详细请看七牛java sdk :https://developer.qiniu.com/kodo/sdk/1239/java
结言
给你们看看处理后的效果图就懂了,这些人在我提供了免费工具的情况下,还投机取巧的撸我的资源,确实有点无耻。
存储量直线下降:
API调用下降明显:
这里API调用下降有延迟要解释下,API调用居高不下主要是有人直接拿了我的图片地址做使用,比如直接微信群推广,转二维码等等。没有及时下降是因为 CDN 是全国式节点,有缓存的情况。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/367.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。