一、上传文件,保存文件路径
上传图片中的文件
1、上传文件的jsp代码:
<form action="${base}/system_appfile_structure/uploadFolder" enctype="multipart/form-data" method="post">
<input type="hidden" name="project_id" value="${project_id}"/>
<input id="dir" type="file" name="file" webkitdirectory mozdirectory/>
<input id="uploadDir" type="submit" value="提交文件夹">
</form>
2、后台service处理(保存文件的方法就不贴了,难点在出来文件夹层级上):
public void uploadFolder(Long project_id, MultipartFile[] file, HttpServletRequest request) throws Exception {
Set set = new HashSet();
for (MultipartFile f : file) {
String parentName = "";
//将文件保存到appfile表中
Long appfile_id = fileUpload(f, request);
if (f instanceof CommonsMultipartFile) {
//转换成这个对象,然后我们需要通过里面的FileItem来获得相对路径
CommonsMultipartFile f2 = (CommonsMultipartFile) f;
String name = f2.getFileItem().getName();
parentName = name.substring(0, name.lastIndexOf("/")+1);
set.add(parentName);
}
AppFileStructureDomain domain = new AppFileStructureDomain();
domain.setProject_id(project_id);
domain.setAppfile_id(appfile_id);
domain.setName(f.getOriginalFilename());
domain.setParent_name(parentName);
domain.setIs_root("N");
domain.setFile_type(getExtension(f.getOriginalFilename()));
appFileStructureDao.save(domain);
}
List<String> list = new ArrayList<String>(set);
for (String str : list) {
if (str.contains("/")) {
List<Integer> indexList = searchAllIndex(str);
if(indexList.size()==1){
AppFileStructureDomain domain = new AppFileStructureDomain();
domain.setProject_id(project_id);
domain.setName(str.substring(0,indexList.get(0)));
domain.setParent_id(-1L);
domain.setIs_root("Y");
domain.setFile_type("folder");
appFileStructureDao.save(domain);
}else {
for(int i=0;i<indexList.size(); i++){
if(i==0){
continue;
}
String name = str.substring(indexList.get(i-1)+1,indexList.get(i));
String parentName=str.substring(0,indexList.get(i-1)+1);
AppFileStructureDomain domain = new AppFileStructureDomain();
domain.setProject_id(project_id);
domain.setName(name);
domain.setParent_name(parentName);
domain.setIs_root("N");
domain.setFile_type("folder");
Integer count = appFileStructureDao.getCount(domain);
if(count==0){
appFileStructureDao.save(domain);
}
}
}
}
}
}
两个小工具方法:
/**
* 获取文件类型
* @param fileName
* @return
*/
private String getExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
/**
* 获取文件夹‘/’所有的位置下标
* @param str
* @return
*/
private List<Integer> searchAllIndex(String str) {
List<Integer> list = new ArrayList<Integer>();
String key="/";
int a = str.indexOf(key);//*第一个出现的索引位置
while (a != -1) {
list.add(a);
a = str.indexOf(key, a + 1);//*从这个索引往后开始第一个出现的位置
}
return list;
}
3、数据库文件结构
二、按原目录展示位树结构
1、前台发起请求
function treeGridInit() {
$("#tblGrid").treegrid({
mode: "remote",
method: 'GET',
url: '${base}/system_appfile_structure/createTreeGrid?is_root=Y&project_id='+${project_id},
idField: "id",
treeField: "name",
singleSelect: true,
border: false,
toolbar: '#divToolbar',
nowrap: false,
fitColumns: true,
fit: true,
onLoadSuccess: function (row, data) {
$(this).treegrid("expandAll");
}
});
$("#tblGrid").datagrid("resize");
}
2、后台接收处理
public List<AppFileStructureDomain> createTreeGrid(AppFileStructureDomain domain) throws Exception {
domain = appFileStructureDao.queryOne(domain);
AppFileStructureDomain appFileStructureDomains = listAllFolder(domain.getName()+"/", domain.getProject_id(),domain);
List<AppFileStructureDomain> tempList = new ArrayList<AppFileStructureDomain>();
tempList.add(appFileStructureDomains);
return tempList;
}
/**
* 递归查询父目录的子文件
* @param parent
* @param project
* @param parentDomain
* @return
*/
private AppFileStructureDomain listAllFolder(String parent,Long project,AppFileStructureDomain parentDomain){
AppFileStructureDomain domain = new AppFileStructureDomain();
domain.setParent_name(parent);
domain.setProject_id(project);
List<AppFileStructureDomain> queryList = appFileStructureDao.query(domain);
parentDomain.setChildren(new ArrayList<AppFileStructureDomain>());
parentDomain.getChildren().addAll(queryList);
for(AppFileStructureDomain item : queryList){
if("folder".equals(item.getFile_type())){
listAllFolder(item.getParent_name()+item.getName()+"/",project,item);
}
}
return parentDomain;
}