JFinal的文件上传功能
JFianl的上传有多种方法 ajax上传、from上传。这次用到的是from上传。
之前做过一个人员统计,现在有一个新需求,针对每个录入的人,再录入的过程中加入文件上传,每个人有个身份证复印件和电子版简历需要上传到系统上。如果上传到同一个地方肯定很不方便。把每个人的身份证复印件和简历放在这个人名字下的文件夹中,及简介又方便。
难点:根据个人去创建个人文件夹来存放单人信息。
思路:在录入过程肯定会有名字,再上传的过程中去传递这个参数。再以这个名字去mkdir文件夹,存放文件。
我将上传加入到 每个人的操作选项中。
这么做可以避免先上传无法创建文件的问题。
前端页面的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>上传附件</title>
<link rel="stylesheet" href="${ctx}/static/admin/layui/css/layui.css">
</head>
<body>
<form class="layui-form layui-form-pane" action="${ctx}/sys/cmkj/uploadFile" enctype="multipart/form-data" method="post">
<div class="layui-form-item">
<label class="layui-form-label">身份证上传</label>
<input type="hidden" name="name" value="${chuangmeng.name}">
<div class="layui-input-block">
<input type="file" name="file" />
<button type="submit" class="layui-btn">提交</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">简历上传</label>
<input type="hidden" name="name" value="${chuangmeng.name}">
<div class="layui-input-block">
<input type="file" name="file" />
<button type="submit" class="layui-btn">提交</button>
</div>
</div>
</form>
</body>
</html>
然后是Controller层代码:
public void uploadFile(){
UploadFile uploadFile=this.getFile();
String name = getPara ("name");
String fileName=uploadFile.getOriginalFileName();
File file=uploadFile.getFile();
Chuangmeng fs=new Chuangmeng();
File t=new File("D:\\file\\"+name+"\\"+fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!t.getParentFile().exists()) {
t.getParentFile().mkdirs();
}
try {
t.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fs.fileChannelCopy(file, t);
file.delete();
this.renderHtml("success,<a href=\"./\">back</a>");
}
控制层需要注意一个问题:
String name = getPara ("name");
传递参数的语句不能写在最开始
要加在
UploadFile uploadFile=this.getFile();
的下面。如果写在上边传递的参数则为null。
创建个人文件夹:
File t=new File("D:\\file\\"+name+"\\"+fileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!t.getParentFile().exists()) {
t.getParentFile().mkdirs();
}
上传的文件 保留原文件名。字符串的拼接一定要注意。
接着是服务层的代码:
public void fileChannelCopy(File s, File t) {
FileInputStream fi = null;
FileOutputStream fo = null;
FileChannel in = null;
FileChannel out = null;
try {
fi = new FileInputStream(s);
fo = new FileOutputStream(t);
in = fi.getChannel();// 得到对应的文件通道
out = fo.getChannel();// 得到对应的文件通道
in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fi.close();
in.close();
fo.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这就是 整个from上传流程的代码。