JFinal

登录 注册

Jfinal文件上传,自定义路径案例

在Jfinal   Config类中只能定义默认上传路径,而我们公司项目需要根据用户进行分类。所以就做了一个,由于JFInal上传文件会上传到默认路径,所以需要根据它默认的上传路径进行删除操作,感觉就这点有点蛋疼



public void identification() {
HttpServletRequest req = getRequest();
String uploadPath = "";
// 文件上传大小设置为20mb,此处不是单个文件大小,是指上传文件总大小
String encoding = "utf-8";
Integer maxPostSize = 1024 * 1024 * 20;
// 获取前端文件数据,getFiles必须放在getPara前面,否则getPara将获取不到值
List<UploadFile> filesList = null;
try {
// 获取表单数据,根据JFinal文档,getFile必须放在getPara之前,否则无法获取到其他文本数据
filesList = getFiles(uploadPath, maxPostSize, encoding);
} catch (Exception e) {// 捕获异常
// e.printStackTrace();   // 打印异常
System.out.println("文件大小异常:" + e);//自定义打印
//向前端返回失败原因
renderJson(Msg.clear().fail().put("reason", "上传图片总大小不得大于20MB"));
return;
}
// 判断文件集合是否为空
if (filesList.size() == 0) {
renderJson(Msg.clear().fail().put("reason", "文件为空"));
return;
}
//appkey值
String appKey = getPara("appKey");
File file = null;
if (appKey == null || "".equals(appKey.trim())) {
renderJson(Msg.clear().fail().put("reason", "appkey不能为空"));
} else if (identifyKey.equals(appKey.trim())) {
// 获取机构代码
String officeCode = getPara("officeCode");
// 获取商户手机号
String merchantPhone = getPara("merchantPhone");
// 根据机构号和商户手机号查询商户信息
Merchant mer = merchantApp.queryMerByPhone(merchantPhone, officeCode);
if (mer == null) {
renderJson(Msg.clear().fail().put("reason", "商户不存在或不在机构下"));
return;
}
Map<String, String> fileMap = new HashMap<>();
fileMap.put("merchantCode", mer.getMerchantCode());
for (UploadFile uploadFile : filesList) {
//获取文件参数名长度
Integer length = uploadFile.getParameterName().length();
//获取上传文件大小
long size = uploadFile.getFile().length(); 
//重定义文件上传路径,Jfinal默认上传路径 + 商户文件夹+商户编号 + 参数名+参数名+图片文件后缀
String path = uploadFile.getUploadPath() + "merchant\\" + mer.getMerchantCode() + "\\"
+ uploadFile.getParameterName().substring(0, length - 1) + "\\" + uploadFile.getParameterName()
+ ".jpg";
//判断文件大小大于2mb则返回错误信息,并终止上传,删除上传文件
if (size > 1024 * 1024 * 2) {
renderJson(Msg.clear().fail().put("reason", "图片文件大小大于2MB,请做好大小处理"));
for (UploadFile uploadFile1 : filesList) {
//根据JFinal上传文件路径删除文件
uploadFile1.getFile().delete();
}
return;
}
//自定义路径
file = new File(path);
//判断文件夹是否存在
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();// 创建文件夹
}
// file文件存在则删除并执行上传,不存在则直接执行上传
if (file.exists()) {
// 删除旧文件
file.delete();
}
uploadFile.getFile().renameTo(file);// 上传文件到指定位置
// 判断图片是否大于1/4Mb 如果大于则压缩图片
if (size > 1024 * 1024 / 4) {
try {
//此处是谷歌图片按比例压缩方法
Thumbnails.of(file).scale(0.25f).toFile(path);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//将图片路径放入到map集合
fileMap.put(uploadFile.getParameterName(), path);
}
//创建商户进件service层
MerchantFeedPartServiceImpl impl = new MerchantFeedPartServiceImpl();
//查询商户信息
List<Merchantfeedpart> list = impl.queryFeedPartByMerCode(mer.getMerchantCode());
boolean bool = false;
if (list.size() > 0) {
bool = impl.updateRealNameInfo(fileMap);
System.out.println("修改");
} else {
bool = impl.addRealNameInfo(fileMap);
System.out.println("新增");
}
if (bool) {
renderJson(Msg.clear().success().put("reason", "上传成功"));
} else {
renderJson(Msg.clear().fail().put("reason", "上传失败"));
}
} else {
//appkey不正确,则删除当次所有上传的文件
renderJson(Msg.clear().fail().put("reason", "appKey值不正确"));
for (UploadFile uploadFile : filesList) {
uploadFile.getFile().delete();
}
}
}


评论

  • 08-01 16:26
    感谢分享,可否用代码方式再编辑一下?
  • 08-17 14:14
    @himans 好的,没问题
  • 08-20 16:27
    谢谢!~
  • 09-06 17:32
    写个文件处理的公共类,removeTo(File file,String destPath)的方法。搞定,至于文件要移动到那个目录去,根据业务规则去生成就ok了,都是通用的东西啊,提取出来,controller调用下就ok。
  • 发送