JFinal文件上传怎么实现黑名单,白名单功能

JFinal文件上传文件上传怎么实现黑名单,白名单功能

评论区

杜福忠

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

好的谢谢,如果能对外 提供接口就好了,不用改现有的东西,在上传之前做一些事情

热门反馈

扫码入社