java利用后置通知和反射,删除参数中已经用过的文件

需求: 文件存在阿里的oss中, 需要把文件上传到另外一个系统中
除了把OSS中的文件下载到本地,不知道其他能获取到File对象的办法,但是往其它服务上传过文件这个本地的文件又没有其它用处了,故而用过就删除掉

其中工具均为: Hutool

上传对象:

@Data
public class InsertAudio extends Audio
{
    /**
     * 音频名称
     * 必填: true
     */
    private String ringName;
    /**
     * 音频文件
     * 必填: true
     */
    private File ringFile;
    /**
     * 资质文件
     * 必填: false
     */
    private File qualificationFile;
    /**
     * 商户id
     * 必填: true
     */
    private String groupId;

    /**
     * 创建联通添加音频
     * @param ringName              音频名称
     * @param ringFileUrl           音频文件
     * @param qualificationFileUrl  资质文件    无: null
     * @param groupId               商户id
     */
    public InsertAudio(String ringName, String ringFileUrl, String qualificationFileUrl,  String groupId)
    {
        this.ringName = ringName;
        this.ringFile = StrUtil.isNotEmpty(ringFileUrl) ? FileUtil.getFile(ringFileUrl) : null;
        this.qualificationFile = StrUtil.isNotEmpty(qualificationFileUrl) ? FileUtil.getFile(qualificationFileUrl) : null;
        this.groupId = groupId;
    }
}

获取OSS上的文件:

public class FileUtil
{
    /**
     * 获取当前系统
     */
    public static boolean isWindows = cn.hutool.core.io.FileUtil.isWindows();

    /**
     * 通过网络地址获取File对象
     * 通过网络把文件下载到本地, 然后获取File对象
     * @param url
     * @return
     */
    public static File getFile(String url)
    {
        return HttpUtil.downloadFileFromUrl(url, StrUtil.format("{}{}", getTemporaryFilePath(), StrUtil.subAfter(url, "/", true)));
    }

    /**
     * 根据系统获取临时文件路径
     * @return
     */
    private static String getTemporaryFilePath()
    {
        return isWindows ? "C:/temporaryFile/" : "/home/temporaryFile";
    }
}

定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DeleteParamsFile
{
}

注解切面实现:

@Aspect
@Component
public class DeleteParamsFileAspect
{
    /**
     * 配置织入点
     */  
	// 此处为自定义注解所在全类名    
    @Pointcut("@annotation(com.xiao.pang.annotation.DeleteParamsFile)")
    public void deleteParamsFilePointCut()
    {
    }

    @After("deleteParamsFilePointCut()")
    public void doAfter(JoinPoint joinPoint)
    {
        handleDeleteParamsFile(joinPoint);
    }

    /**
     * 获取方法中参数,删除参数中的文件
     * @param joinPoint
     */
    void handleDeleteParamsFile(final JoinPoint joinPoint)
    {
        Object[] args = joinPoint.getArgs();
        // 没参数
        if (ObjectUtil.isNull(args))
        {
            return;
        }
        for(Object arg: args)
        {
            this.deleteObjFile(arg);
        }
    }

    /**
     * 删除指定对象中的所有文件
     * @param arg   指定对象
     */
    private void deleteObjFile(Object arg)
    {
         if (ObjectUtil.isNull(arg))
        {
            return;
        }
        // 如果是文件直接删除
        if (arg instanceof File)
        {
            ((File)arg).delete();
            return;
        }
        // 其它对象类型, 删除对象中的所有文件(依据属性为文件,并且不是null)
        // 获取对象中的字段
        Field[] fieldsDirectly = ReflectUtil.getFieldsDirectly(arg.getClass(), false);
        Arrays.stream(fieldsDirectly)
                // 如果是文件对象
                .filter(field -> field.getType() == File.class)
                // 获取对象值
                .map(field -> (File)ReflectUtil.getFieldValue(arg, field))
                // 筛选非空文件
                .filter(ObjectUtil::isNotNull)
                // 删除文件
                .forEach(File::delete);
    }
}

使用:

	@DeleteParamsFile
    @Override
    public <T> T insertAudio(InsertAudio insertAudio)
    {
        return (T)this.post(UnicomConstant.INSERT_AUDIO_URL, insertAudio);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值