首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
JFinal文件上传怎么实现黑名单,白名单功能
东泠
2021-09-02 10:19
JFinal文件上传文件上传怎么实现黑名单,白名单功能
项目:
JFinal
3
评论区
杜福忠
2021-09-02 10:57
这个判断规则说的是文件后缀名?大小?文件内容?
回复
东泠
2021-09-02 10:59
恩 ,主要是文件后缀
回复
风满楼
2021-09-02 13:58
你可以参考下我这个 我只是简单实现 你看看满足你的需求吗
--------------------------------------------------------------------
public class UploadableFileInterceptor implements Interceptor{
@Inject
private FileService fileService;
@Override
public void intercept(Invocation inv) {
Controller controller = inv.getController();
HttpServletRequest request = controller.getRequest();
String contentType = request.getContentType();
// 如果Request是MultipartRequest类型的请求 则校验是否是可上传的文件类型
if(request instanceof MultipartRequest
|| (contentType != null && contentType.toLowerCase().contains("multipart"))) {
// 可上传文件类型
Kv kv = fileService.ableUploadFileType();
@SuppressWarnings("unchecked")
Set ableUploadFileType = kv.keySet();
List files = controller.getFiles();
for (UploadFile uploadFile : files) {
String originalFileName = uploadFile.getOriginalFileName();
// 文件后缀
String fileExtension = FileKit.getFileExtension(originalFileName);
if(StrKit.isBlank(fileExtension)) {
this.clean(files);
controller.renderJson(Ret.fail("msg", originalFileName + "文件格式错误 无后缀"));
return;
}
if(! ableUploadFileType.contains(fileExtension.toLowerCase())) {
this.clean(files);
controller.renderJson(Ret.fail("msg", fileExtension + "类型文件不可上传"));
return;
}
}
}
inv.invoke();
}
/**
* 清空上传文件
*/
private void clean(List files) {
// 不清空基础上传文件路径下的所有文件 防止上传以后不移动文件 直接以该路径为存储路径的情况下 删除文件
// Constants constants = JFinal.me().getConstants();
// String baseUploadPath = constants.getBaseUploadPath();
// String folder = PathKit.getWebRootPath() + "/" + baseUploadPath;
// File file = new File(folder);
// if(file.exists()) {
// FileUtil.clean(file);
// }
// 改为循环删除 只删除上传文件
files.forEach(uploadFile -> {
FileKit.delete(uploadFile.getFile());
});
}
}
回复
风满楼
2021-09-02 14:02
// 可上传文件类型
Kv kv = fileService.ableUploadFileType();
这个我是配置到表里的 然后查到放到缓存里 你也可以不放到表里
------------------------------------------------------------------------------------------
public Kv ableUploadFileType() {
Kv kv = CacheKit.get(CacheConst.FILE_TYPE_CACHE, "fileTypeCache", new IDataLoader() {
@Override
public Kv load() {
Kv kv = Kv.create();
String sql = "SELECT * FROM T_FILE_TYPE";
Db.find(sql).forEach(record -> {
kv.set(record.getStr("TYPE"), record.getInt("CODE"));
});
return kv;
}
});
return kv;
}
回复
超级大富
2021-09-03 10:03
@风满楼
我觉得文件也是一种参数,可以归到Validator,虽然用Interceptor也一样
回复
东泠
2021-09-03 14:46
使用getFile()文件已经上传了,有没有提供在上传之前判断的接口
回复
杜福忠
2021-09-06 14:15
@东泠
把最新版cos-2020.4.jar的com.oreilly.servlet.MultipartRequest类复制出来,改一下parse方法,创建UploadedFile之前做业务拦截,然后直接使用自己的MultipartRequest去接收就可以,或者创建BaseController在里面重写getFile系列方法
回复
东泠
2021-09-06 15:23
好的谢谢,如果能对外 提供接口就好了,不用改现有的东西,在上传之前做一些事情
回复
发送
我要反馈
热门反馈
扫码入社