需求: 文件存在阿里的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);
}