七牛云存储图片

1. 图片存储方案

方案一:使用nginx搭建图片服务器
方案二:使用开源的分布式文件存储系统,例如Fastdfs、HDFS等
方案三:使用云存储,例如阿里云、七牛云等

2. 七牛云存储

七牛云官网

1.注册登录成功后点击页面右上角管理控制台:
在这里插入图片描述2.新建存储空间
在这里插入图片描述可以创建多个存储空间,各个存储空间是相互独立的。

通过域名和文件名即可访问图片
在这里插入图片描述

JAVA集成

导入需要的maven坐标,获取有效的Access Key和Secret Key
Java官方文档

    //构造一个带指定 Region 对象的配置类
    Configuration cfg = new Configuration(Region.region0());
    //...其他参数参考类注释
    UploadManager uploadManager = new UploadManager(cfg);
    //...生成上传凭证,然后准备上传
    String accessKey = "your access key";
    String secretKey = "your secret key";
    String bucket = "your bucket name"; //存储空间的名称
    //如果是Windows情况下,格式是 D:\\qiniu\\test.png
    String localFilePath = "/home/qiniu/test.png"; //文件的绝对路径
    //默认不指定key的情况下,以文件内容的hash值作为文件名
    String key = null;//可以起文件名。例如:123.jpg
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket);
    try {
        Response response = uploadManager.put(localFilePath, key, upToken);
        //解析上传成功的结果
        DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        System.out.println(putRet.key);
        System.out.println(putRet.hash);
    } catch (QiniuException ex) {
        Response r = ex.response;
        System.err.println(r.toString());
        try {
            System.err.println(r.bodyString());
        } catch (QiniuException ex2) {
            //ignore
        }
    }

还支持字节数组上传

删除空间中的文件
    //构造一个带指定 Region 对象的配置类
    Configuration cfg = new Configuration(Region.region0());
    //...其他参数参考类注释
    String accessKey = "your access key";
    String secretKey = "your secret key";
    String bucket = "your bucket name";//存储空间
    String key = "your file key";//要删除的文件名称
    Auth auth = Auth.create(accessKey, secretKey);
    BucketManager bucketManager = new BucketManager(auth, cfg);
    try {
        bucketManager.delete(bucket, key);
    } catch (QiniuException ex) {
        //如果遇到异常,说明删除失败
        System.err.println(ex.code());
        System.err.println(ex.response.toString());
    }
完善文件上传

如果用户只上传了图片而没有最终保存套餐信息到我们的数据库,这时我
们上传的图片就变为了垃圾图片。对于这些垃圾图片我们需要定时清理来释放磁盘空
间。这就需要我们能够区分出来哪些是垃圾图片,哪些不是垃圾图片。

方案就是利用redis来保存图片名称,具体做法为:
1、当用户上传图片后,将图片名称保存到redis的一个Set集合中,例如集合名称为
setmealPicResources
2、当用户添加套餐后,将图片名称保存到redis的另一个Set集合中,例如集合名称为
setmealPicDbResources
3、计算setmealPicResources集合与setmealPicDbResources集合的差值,结果就是垃圾图片的名称集合,清理这些图片即可

3.Quartz

1.导入pom文件

<dependency>
<groupId>org.quartz‐scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz‐scheduler</groupId>
<artifactId>quartz‐jobs</artifactId>
<version>2.2.1</version>
</dependency>

2.自定义工作

/**
* 自定义Job
*/
public class JobDemo {
public void run(){
System.out.println("job execute...");
}
}

3.提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度
工厂等

<?xml version="1.0" encoding="UTF‐8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring‐beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring‐
mvc.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring‐context.xsd">
<!‐‐ 注册自定义Job ‐‐>
<bean id="jobDemo" class="com.itheima.jobs.JobDemo"></bean>
<!‐‐ 注册JobDetail,作用是负责通过反射调用指定的Job ‐‐>
<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFacto
ryBean">
<!‐‐ 注入目标对象 ‐‐>
<property name="targetObject" ref="jobDemo"/>
<!‐‐ 注入目标方法 ‐‐>
<property name="targetMethod" value="run"/>
</bean>
<!‐‐ 注册一个触发器,指定任务触发的时间 ‐‐>
<bean id="myTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!‐‐ 注入JobDetail ‐‐>
<property name="jobDetail" ref="jobDetail"/>
<!‐‐ 指定触发的时间,基于Cron表达式 ‐‐>
<property name="cronExpression">
<value>0/10 * * * * ?</value>
</property>
</bean>

<!‐‐ 注册一个统一的调度工厂,通过这个调度工厂调度任务 ‐‐>
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!‐‐ 注入多个触发器 ‐‐>
<property name="triggers">
<list>
<ref bean="myTrigger"/>
</list>
</property>
</bean>
</beans>
cron表达式

逗号(,):指定一个值列表,例如使用在月域上1,4,5,7表示1月、4月、5月和7月
横杠(-):指定一个范围,例如在时域上3-6表示3点到6点(即3点、4点、5点、6点)
星号(*):表示这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发
斜线(/):表示递增,例如使用在秒域上0/15表示每15秒
问号(?):只能用在日和周域上,但是不能在这两个域上同时使用。表示不指定
井号(#):只能使用在周域上,用于指定月份中的第几周的哪一天,例如6#3,意思是某月的第三个周五 (6=星期五,3意味着月份中的第三周)
L:某域上允许的最后一个值。只能使用在日和周域上。当用在日域上,表示的是在月域
上指定的月份的最后一天。用于周域上时,表示周的最后一天,就是星期六
W:W 字符代表着工作日 (星期一到星期五),只能用在日域上,它用来指定离指定日的最近的一个工作日

cron表达式在线生成器





/**
* 自定义Job,实现定时清理垃圾图片
*/
public class ClearImgJob {
@Autowired
private JedisPool jedisPool;
public void clearImg(){
//根据Redis中保存的两个set集合进行差值计算,获得垃圾图片名称集合
Set<String> set =
jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES,
RedisConstant.SETMEAL_PIC_DB_RESOURCES);
if(set != null){
for (String picName : set) {
//删除七牛云服务器上的图片
QiniuUtils.deleteFileFromQiniu(picName);
//从Redis集合中删除图片名称
jedisPool.getResource().
srem(RedisConstant.SETMEAL_PIC_RESOURCES,picName);
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值