springboot+freemark+jpa+MySQL实现的在线网盘文件分享系统,其功能跟百度网盘非常类似,普通用户可以注册登录,注册后默认分配1G的空间大小,登录进去后可以新建文件夹、上传各种类型的文件、文件移动、复制、下载、删除、分享,分享分为私密分享和公开分享,还可以设置分享过期时间,打开分享链接后可以对文件进行查看、下载、保存到自己网盘等。超级管理员登录后可以设置普通用户的空间大小、角色类型、权限等。
本系统主要涉及的特色功能有:
1:系统在上传文件时自动计算文件的md5值,并且检查该值是否存在,若存在则文件不再上传到服务器,直接进行引用原有的文件。
2:定时器定时检查限时分享的文件是否过期。
3:网盘目录结构可无限制层级创建,保存移动复制文件时递归所选文件夹层级等等。
使用技术:java+springboot+freemark+jpa+MySQL+maven
管理员控制器:
/**
-
@ClassName: AdminController
-
@Description: 管理员控制器
**/
@Controller
public class AdminController extends BaseController {
private Logger logger = LogUtils.getInstance(AdminController.class);/**
- @Description 前往用户管理页面
**/
@GetMapping("/manages-users")
public String manageUsers(Map<String,Object> map,Integer cur){
if (loginUser.getRole() == 1){
//用于无访问权限
logger.error(“当前登录用户:”+loginUser.getUserName()+“无管理员权限!”);
return “redirect:/error401Page”;
}
//获取全部的用户
Integer usersCount = userService.getUsersCount();
//获取当前查询的页数,如果为空,默认为0
cur = (cur == null || cur<0)?0:cur;
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
//分页获得20个用户信息
Page page = PageHelper.startPage(cur, 20);
List users = userService.getUsers();
map.put(“statistics”, statistics);
map.put(“users”, users);
map.put(“page”, page);
map.put(“usersCount”, usersCount);
logger.info(“用户管理域的内容:”+map);
return “admin/manage-users”;
}
/**
- @Description 修改用户的权限和最大容量
**/
@GetMapping("/updateStoreInfo")
@ResponseBody
public String updateStoreInfo(Integer uId,Integer pre,Integer size){
Integer integer = fileStoreService.updatePermission(uId, pre, size*1024);
if (integer == 1) {
//更新成功,返回200状态码
logger.info(“修改用户”+userService.queryById(uId).getUserName()+":的权限和仓库大小成功!");
return “200”;
}else {
//更新失败,返回500状态码
logger.error(“修改用户”+userService.queryById(uId).getUserName()+":的权限和仓库大小失败!");
return “500”;
}
}
/**
- @Description 删除用户
**/
@GetMapping("/deleteUser")
public String deleteUser(Integer uId,Integer cur){
cur = (cur == null || cur < 0)?1:cur;
User user = userService.queryById(uId);
FileStore fileStore = fileStoreService.getFileStoreByUserId(uId);
List folders = fileFolderService.getRootFoldersByFileStoreId(fileStore.getFileStoreId());
//迭代删除文件夹
for (FileFolder f:folders) {
deleteFolderF(f);
}
List files = myFileService.getRootFilesByFileStoreId(fileStore.getFileStoreId());
//删除该用户仓库根目录下的所有文件
for (MyFile f:files) {
String remotePath = f.getMyFilePath();
String fileName = f.getMyFileName()+f.getPostfix();
//从FTP文件服务器上删除文件
boolean b = FtpUtil.deleteFile("/"+remotePath, fileName);
if (b){
//删除成功,返回空间
fileStoreService.subSize(f.getFileStoreId(),Integer.valueOf(f.getSize()));
//删除文件表对应的数据
myFileService.deleteByFileId(f.getMyFileId());
}
logger.info(“删除文件成功!”+f);
}
if (FtpUtil.deleteFolder("/" + uId)){
logger.info(“清空FTP上该用户的文件成功”);
}else {
logger.error(“清空FTP上该用户的文件失败”);
}
userService.deleteById(uId);
fileStoreService.deleteById(fileStore.getFileStoreId());
return “redirect:/manages-users?cur=”+cur;
}
/**
- @Description 迭代删除文件夹里面的所有文件和子文件夹
/
public void deleteFolderF(FileFolder folder){
//获得当前文件夹下的所有子文件夹
List folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());
//删除当前文件夹的所有的文件
List files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());
if (files.size()!=0){
for (int i = 0; i < files.size(); i++) {
Integer fileId = files.get(i).getMyFileId();
boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());
if (b){
myFileService.deleteByFileId(fileId);
fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
}
文件仓库控制器:
/
- @Description 前往用户管理页面
-
@ClassName: FileStoreController
-
@Description: 文件仓库控制器
**/
@Controller
public class FileStoreController extends BaseController {
private Logger logger = LogUtils.getInstance(FileStoreController.class);/**
- @Description 上传临时文件
**/
@PostMapping("/uploadTempFile")
public String uploadTempFile(@RequestParam(“file”) MultipartFile file,String url) {
session.setAttribute(“imgPath”,“https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg”);
String name = file.getOriginalFilename().replaceAll(" “,”");
if (!checkTarget(name)){
logger.error(“临时文件上传失败!文件名不符合规范…”);
session.setAttribute(“msg”, “上传失败!文件名不符合规范”);
return “redirect:/temp-file”;
}
SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd”);
String dateStr = format.format(new Date());
String path = “temp/”+dateStr +"/"+UUID.randomUUID();
try {
if (FtpUtil.uploadFile("/"+path, name, file.getInputStream())){
//上传成功
logger.info(“临时文件上传成功!”+name);
String size = String.valueOf(file.getSize());
TempFile tempFile = TempFile.builder().fileName(name).filePath(path).size(size).uploadTime(new Date()).build();
if (tempFileService.insert(tempFile)) {
try {
String id = UUID.randomUUID().toString();
String p = request.getSession().getServletContext().getRealPath("/user_img/");
Long t = tempFile.getUploadTime().getTime();
url = url+"/file/share?t="+ UUID.randomUUID().toString().substring(0,10) +"&f="+tempFile.getFileId()+"&p="+size+"&flag=2";
File targetFile = new File(p, “”);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
- @Description 上传临时文件