公司要求,在网上找了一个开源的网盘管理系统,并做了二次开发.非常感谢开源软件的作者提供的帮助
软件地址:
https://gitee.com/kohgylw/kiftd
在此基础上,公司要求开发如下功能
1.在上传文件时,添加一个摘要,用以描述上传的文件
上传文本框添加一个textarea
<h5>
输入摘要:
</h5>
<textarea rows="3" style="width: 100%;" id="remark"></textarea>
js文件的上传方法里添加代码,(搜remark)
将摘要信息添加到FormData对象中,字段名为remark
fd.append("remark",$("#remark").val());
上传完成或者取消,失败的情况下,要清空摘要信息
$("#remark").val("");
数据库表添加字段file_remark,
文件实体类添加成员属性remark,getset方法
从请求对象里取出remark属性
在业务逻辑层(doUploadFile方法), 正常上传和同名文件更新两种情况的 文件对象赋值时,给remark属性赋值
在mybatis的xml文件中添加remark字段
2.下载按钮改为3个按钮
a.直接下载
b.查看下载链接
c.复制下载链接
修改较为简单
a.注释原本的下载功能
b.添加3个按钮对象,难点在于字符串拼接,多测几次就好了
fileRow = fileRow +"<a href='" + window.location.protocol + "//" + window.location.host + "/homeController/downloadFile.do?fileId=" + fi.fileId + "'>" +
"<span class='glyphicon glyphicon-download'></span>直接下载</a>";
fileRow = fileRow+ "<button onclick='copyDownloadBoard("
+ '"'
+ window.location.protocol + "//" + window.location.host + "/homeController/downloadFile.do?fileId=" + fi.fileId
+ '"'
+ ")' class='btn btn-link btn-xs'><span class='glyphicon glyphicon-copyright-mark'></span> 复制链接</button>";
fileRow = fileRow+ "<button onclick='showDownloadLink("
+ '"'
+ window.location.protocol + "//" + window.location.host + "/homeController/downloadFile.do?fileId=" + fi.fileId
+ '"'
+ ")' class='btn btn-link btn-xs'><span class='glyphicon glyphicon-search'></span> 查看链接</button>";
复制链接的方法:
https://blog.csdn.net/qq_36194262/article/details/86631119
但是,IE 浏览器中不能使remove删除节点,需要参考以下方法解决
https://blog.csdn.net/myuserandwubin/article/details/45056117
3.以excel形式导出所有文档信息,导出的文件格式如下:
文件存放不是采用的类似windows的文件系统结构,而是索引的形式存放文件,所以文件路径这一列,采用了作者提供的方法获取,在每次导出excel表格时调用遍历所有文件的目录结构,动态生成文件路径,文件越多,耗时约多.
开发过程:
输出文档按钮 和js
<span id="tb" class="rightbtn"></span>
<button class="btn btn-link rightbtn" onclick="getdocExcel()">
输出文档EXCEL <span class="glyphicon glyphicon-download" aria-hidden="true"></span>
</button>
//获取输出文档
function getdocExcel(){
window.location.href="/homeController/getdocExcel.ajax";
}
后端控制层方法:
@RequestMapping({ "/getdocExcel.ajax" })
public void getdocExcel(final HttpServletRequest request, final HttpServletResponse response) {
System.out.println("测试");
//获取所有文件
List<Node> allFiles = fis.getAllFiles(request);
String[] title = { "文件名", "下载链接", "说明", "文件路径" };
//组装工作簿对象
HSSFWorkbook hw = excel.getHSSFWorkbook("工作簿1", request, title, allFiles);
//设置响应头
Excel.setResponseHeader(response, "输出表格.xls");
//写出文件
OutputStream os;
try {
os = response.getOutputStream();
// os=new FileOutputStream(new File("C:\\Users\\ebpm\\Desktop\\11.xlsx"));
hw.write(os);
os.flush();
os.close();
System.out.println(allFiles);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileServiceImpl类也就是业务逻辑层添加获取所有文件方法,调用已经写好的queryAll方法就行了
@Override
public List<Node> getAllFiles(HttpServletRequest request) {
return fm.queryAll();
}
mapper类的resultmap添加
<result column="file_remark" jdbcType="VARCHAR"property="fileRemark" />
1..16版本之后不要额外在pom.xml添加poi依赖!!!
会出现以下错误,因为1.16版本作者新增了在线预览word功能,已经有了poi依赖
https://blog.csdn.net/myid/article/details/7222256
util中添加一个excel类,有如下2个方法 ,输出excel对象,以及修改响应头
public HSSFWorkbook getHSSFWorkbook(String sheetName, HttpServletRequest request, String[] title,
List<Node> List) {
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
// 声明列对象
HSSFCell cell = null;
// 创建标题
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
int i = 1;
for (Node node : List) {
row = sheet.createRow(i);
row.createCell(0).setCellValue(node.getFileName());
row.createCell(1).setCellValue("http://" + request.getServerName() // 获取服务器ipַ
+ ":" + request.getServerPort() + "/homeController/downloadFile.do?fileId=" + node.getFileId());
row.createCell(2).setCellValue(node.getFileRemark());
StringBuilder sb=new StringBuilder();
List<Folder> parentList = fu.getParentList(node.getFileParentFolder());
for(Folder folder :parentList) {
sb.append("/"+folder.getFolderName());
}
row.createCell(3).setCellValue(sb.toString());
i++;
}
//自动适应列宽
sheet.autoSizeColumn(0, true);
sheet.autoSizeColumn(1, true);
sheet.autoSizeColumn(2, true);
sheet.autoSizeColumn(3, true);
return wb;
}
设置响应头
// 发送响应流方法
public static void setResponseHeader(HttpServletResponse response, String fileName) {
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");// 设置contentType为excel格式
response.addHeader("Content-Disposition",
" attachment;filename=" + new String(fileName.getBytes(),"iso-8859-1"));
} catch (Exception e) {
e.printStackTrace();
}
}
FolderUtil类新建方法:
public List<Folder> getFolderList(final String fid) {
Folder f = this.fm.queryById(fid);
final List<Folder> folderList = new ArrayList<Folder>();
folderList.add(f);
if (f != null) {
while (!f.getFolderParent().equals("null")) {
f = this.fm.queryById(f.getFolderParent());
folderList.add(f);
}
}
Collections.reverse(folderList);
return folderList;
}
业务流程:
用户点击输出文档链接
,homecontroller接受到,调用方法获取所有文件(二次开发)
调用生成excel方法组装工作簿
其中,文档路径采用遍历方式,遍历所有的文档,一个一个获取路径
开发和运维注意事项
-
打jar包:
编译的时候先clean,再maven install 再复制静态资源resource文件夹
注意:maven 不会把resource文件夹下的静态资源(png)也复制到target文件夹,所以需要手动复制,这是必须的
再maven install
home.html默认引入的是home-min.js文件而不是home.js文件
新的版本记得复制开发项目的jar包和webcontext(静态资源),mybatisResource(mybatis映射文件),fonts文件夹(1.16版本)到正式项目路径下
-
系统迁移:
见文档
-
数据库:
新建的数据库记得加一个file_remark字段,varchar类型,长度255即可,可以为空
数据库连接时的时区问题(1.16版本后已解决)
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized
https://blog.csdn.net/qq_39098813/article/details/81138648