使用七牛云存储实现图片API,自动删除图片方案合集

JSON 2020-05-19 14:35:15 12416

七牛图片处理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

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
又拍(Upyun)CDN、存储刷新链接缓存,API实例讲解
恭喜那个做存储完成 F 轮 10 亿人民币的融资,开启新的旅程
Oracle与Mysql删除重复的数据,Oracle和Mysql数据去重复
Maven项目使用,以及注意事项。
Java 集成阿里消息队列,日志消息存储
Javascript 删除节点后是否需要将手动将事件解绑?
又拍(Upyun)刷新CDN,存储缓存 —JavaAPI
SOJSON 使用又拍 CDN 整体架构,解决百度 SEO 方案
N多系统单点登录,实现、解决方案。四种解决方案
SpringBoot 集成Spring-data-redis,redis对象序列化存储
最新文章
Python print() 函数 21
PHP if/else/elseif 语句 81
HTML5 Canvas弧线教程 74
Java赋值运算符 118
XML内部实体和外部实体 217
Java面向对象编程概念 177
PHP回显语句 128
Linux—文件树 142
C语言while循环和do while循环 150
Python元组剖析 214
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 682801
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 674741
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 603031
免费天气API,天气JSON API,不限次数获取十五天的天气预报 581304
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 553167
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 509466
Elasticsearch教程(四) elasticsearch head 插件安装和使用 480074
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 264931
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244332
Elasticsearch教程(一),全程直播(小白级别) 225661
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...