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

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

七牛图片处理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 亿人民币的融资,开启新的旅程
Javascript 删除节点后是否需要将手动将事件解绑?
Oracle与Mysql删除重复的数据,Oracle和Mysql数据去重复
如何使用canvas转换图片类型
如何使用canvas转换图片类型
Maven项目使用,以及注意事项。
MySQL存储引擎
SOJSON 使用又拍 CDN 整体架构,解决百度 SEO 方案
Java 集成阿里消息队列,日志消息存储
最新文章
文件上传漏洞与防御 4058
前端构建工具选型指南:Webpack、Vite、Rollup、esbuild 深度对比 1444
物联网时代2026年时序数据库选型指南 1151
SaaS行业面临AI挑战:从“无限复用”到“灵活适应” 1269
神经网络:从构造到模型训练全链路解析 1168
一文吃透 Redis 核心存储结构:ziplist、listpack 与哈希表扩容 / 并发查询 1593
Linux sudo提权完整指南:从基础用法到生产级安全配置 691
XSS 和 CSRF 的本质区别及开发防御全解析 772
JVM垃圾回收(GC)全维度解析:从原理到调优实战 813
Linux动静态库与ELF加载全解析:从实操制作到底层原理 912
最热文章
免费天气API,天气JSON API,不限次数获取十五天的天气预报 783114
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 711464
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 679993
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 562673
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 512621
Elasticsearch教程(四) elasticsearch head 插件安装和使用 484794
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 302947
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 247433
Elasticsearch教程(一),全程直播(小白级别) 233097
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 228329
支付扫码

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

查看我的收藏

正在加载... ...