基于javaweb的在线嘿嘿网盘系统设计和实现(java+springboot+ssm+mysql)

基于javaweb的在线嘿嘿网盘系统设计和实现(java+springboot+ssm+mysql)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

20220519002645

20220519002646

20220519002648

20220519002649

20220519002650

基于javaweb+springboot的在线网盘系统(java+Springboot+ssm+mysql+maven)

一、项目简述

功能:用户的邮箱注册、验证码验证以及用户登录。 不需要注册账号,也可以上传满足条件的临时文件,但是 只4小时内有效。 文件的管理,上传、下载、重命名、删除、查看统计数 据、分类管理等。 文件夹的管理,创建、删除、重命名。 文件的分享,支持通过链博口二维码的分享方式等等。

二、项目运行

环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)

项目技术: JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等

管理员控制器:

/**

  • @ClassName: AdminController

  • @Descriiption: 管理员控制器

**/

@Controller

public class AdminController extends BaseController {

private Logger logger = LogUtils.getInstance(AdminController.class);

/**

  • @Descriiption 前往用户管理页面

  • @Author xw

  • @Date 15:11 2020/3/10

  • @Param [map]

  • @return java.lang.String

**/

@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”;

/**

  • @Descriiption 修改用户的权限和最大容量

  • @Author xw

  • @Date 18:20 2020/3/10

  • @Param [uId, pre, size]

  • @return java.lang.String

**/

@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”;

/**

  • @Descriiption 删除用户

  • @Author xw

  • @Date 18:44 2020/3/10

  • @Param [uId, cur]

  • @return java.lang.String

**/

@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;

/**

  • @Descriiption 迭代删除文件夹里面的所有文件和子文件夹

  • @Author xw

  • @Date 9:17 2020/2/29

  • @Param [folder]

  • @return void

**/

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());

登录控制器:

/**

  • @Descriiption 登录控制器

  • @return

**/

@Controller

public class LoginController extends BaseController {

private Logger logger = LogUtils.getInstance(LoginController.class);

/**

  • @Descriiption 免登陆用户入口,用于本地开发测试,上线运营为了安全请删除此方法

  • @Author xw

  • @Date 15:17 2020/2/26

  • @Param []

  • @return java.lang.String

**/

@GetMapping(“/admin”)

public String adminLogin(){

User user = userService.getUserByOpenId(“123456”);

logger.info(“使用免登陆方式登录成功!”+user);

session.setAttribute(“loginUser”, user);

return “redirect:/index”;

/**

  • 用于注册流程,用户名,密码,邮箱等校验工作由前端来完成

  • @param map 用于存储提示信息

  • @author GGBOY

  • @date 2020/1/28

*/

@PostMapping(“/register”)

public String register(User user, String code, Map<String, Object> map) {

String uCode = (String) session.getAttribute(user.getEmail() + “_code”);

if (!code.equals(uCode)) {

map.put(“errorMsg”, “验证码错误”);

return “index”;

// 用户名去空格

user.setUserName(user.getUserName().trim());

user.setImagePath(“https://p.qpic.cn/qqconnect/0/app_101851241_1582451550/100?max-age=2592000&t=0”);

user.setRegisterTime(new Date());

user.setRole(1);

if (userService.insert(user)) {

FileStore store = FileStore.builder().userId(user.getUserId()).currentSize(0).build();

fileStoreService.addFileStore(store);

user.setFileStoreId(store.getFileStoreId());

userService.update(user);

logger.info(“注册用户成功!当前注册用户” + user);

logger.info(“注册仓库成功!当前注册仓库” + store);

} else {

map.put(“errorMsg”, “服务器发生错误,注册失败”);

return “index”;

session.removeAttribute(user.getEmail() + “_code”);

session.setAttribute(“loginUser”, user);

return “redirect:/index”;

/**

  • 用户登录

  • @param map 存储提示信息

  • @return java.lang.String

  • @author 莫提

  • @date 2020/1/28

*/

@PostMapping(“/login”)

public String login(User user, Map<String, Object> map) {

User userByEmail = userService.getUserByEmail(user.getEmail());

if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {

session.setAttribute(“loginUser”, userByEmail);

logger.info(“登录成功!”+userByEmail);

return “redirect:/index”;

}else{

User user1 = userService.getUserByEmail(user.getEmail());

String errorMsg = user1 == null ? “该邮箱尚未注册” : “密码错误”;

logger.info(“登录失败!请确认邮箱和密码是否正确!”);

//登录失败,将失败信息返回前端渲染

map.put(“errorMsg”, errorMsg);

return “index”;

/**

  • @return void

  • @Descriiption 向注册邮箱发送验证码, 并验证邮箱是否已使用

  • @Author xw

  • @Date 19:32 2020/1/29

  • @Param [userName, email, password]

**/

@ResponseBody

@RequestMapping(“/sendCode”)

public String sendCode(String userName, String email, String password) {

User userByEmail = userService.getUserByEmail(email);

if (userByEmail != null) {

logger.error(“发送验证码失败!邮箱已被注册!”);

return “exitEmail”;

logger.info(“开始发送邮件…/n” + “获取的到邮件发送对象为:” + mailSender);

mailUtils = new MailUtils(mailSender);

String code = “123456”;

session.setAttribute(email + “_code”, code);

return “success”;

/**

  • @Descriiption 请求QQ登录

  • @Author xw

  • @Date 18:27 2020/2/25

  • @Param []

  • @return void

**/

@GetMapping(“/loginByQQ”)

public void login() {

response.setContentType(“text/html;charset=utf-8”);

try {

response.sendRedirect(new Oauth().getAuthorizeURL(request));

logger.info(“请求QQ登录,开始跳转…”);

} catch (QQConnectException | IOException e) {

e.printStackTrace();

/**

  • @Descriiption QQ登录回调地址

  • @Author xw

  • @Date 18:27 2020/2/25

  • @Param []

  • @return java.lang.String

**/

@GetMapping(“/connection”)

public String connection() {

try {

AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);

String accessToken = null, openID = null;

long tokenExpireIn = 0L;

if (“”.equals(accessTokenObj.getAccessToken())) {

logger.error(“登录失败:没有获取到响应参数”);

return “accessTokenObj=>” + accessTokenObj + “; accessToken” + accessTokenObj.getAccessToken();

} else {

accessToken = accessTokenObj.getAccessToken();

tokenExpireIn = accessTokenObj.getExpireIn();

logger.error(“accessToken” + accessToken);

request.getSession().setAttribute(“demo_access_token”, accessToken);

request.getSession().setAttribute(“demo_token_expirein”, String.valueOf(tokenExpireIn));

// 利用获取到的accessToken 去获取当前用的openid -------- start

OpenID openIDObj = new OpenID(accessToken);

openID = openIDObj.getUserOpenID();

UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);

UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();

if (userInfoBean.getRet() == 0) {

logger.info("用户的OPEN_ID: " + openID);

logger.info("用户的昵称: " + removeNonBmpUnicode(userInfoBean.getNickname()));

logger.info("用户的头像URI: " + userInfoBean.getAvatar().getAvatarURL100());

//设置用户信息

User user = userService.getUserByOpenId(openID);

if (user == null){

user = User.builder()

.openId(openID).userName(removeNonBmpUnicode(userInfoBean.getNickname()))

.imagePath(userInfoBean.getAvatar().getAvatarURL100()).

registerTime(new Date()).build();

if (userService.insert(user)){

logger.info(“注册用户成功!当前注册用户” + user);

FileStore store = FileStore.builder().userId(user.getUserId()).build();

if (fileStoreService.addFileStore(store) == 1){

user.setFileStoreId(store.getFileStoreId());

userService.update(user);

logger.info(“注册仓库成功!当前注册仓库” + store);

} else {

logger.error(“注册用户失败!”);

}else {

user.setUserName(removeNonBmpUnicode(userInfoBean.getNickname()));

user.setImagePath(userInfoBean.getAvatar().getAvatarURL100());

userService.update(user);

logger.info(“QQ用户登录成功!”+user);

session.setAttribute(“loginUser”, user);

return “redirect:/index”;

} else {

logger.error("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());

} catch (QQConnectException e) {

} finally {

logger.error(“登录成功!”);

return “登录失败!请查看日志信息…”;

/**

  • @Descriiption 处理掉QQ网名中的特殊表情

  • @Author xw

  • @Date 18:26 2020/2/25

  • @Param [str]

  • @return java.lang.String 返回处理之后的网名

**/

public String removeNonBmpUnicode(String str) {

if (str == null) {

return null;

str = str.replaceAll(“[^\u0000-\uFFFF]”, “”);

if (“”.equals(str)) {

str = “($ _ $)”;

return str;

/**

  • @Descriiption 退出登录,清空session

  • @Author xw

  • @Date 18:26 2020/2/25

  • @Param []

  • @return java.lang.String

**/

@GetMapping(“/logout”)

public String logout() {

logger.info(“用户退出登录!”);

session.invalidate();

return “redirect:/”;

文件仓库控制器:

/**

  • @ClassName: FileStoreController

  • @Descriiption: 文件仓库控制器

**/

@Controller

public class FileStoreController extends BaseController {

private Logger logger = LogUtils.getInstance(FileStoreController.class);

/**

  • @Descriiption 上传临时文件

  • @Author xw

  • @Date 23:14 2020/3/9

  • @Param [files]

  • @return void

**/

@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();

File f = new File(p, id + “.jpg”);

if (!f.exists()){

//文件不存在,开始生成二维码并保存文件

OutputStream os = new FileOutputStream(f);

QRCodeUtil.encode(url, “/static/img/logo.png”, os, true);

os.close();

//异步删除临时文件

tempFileService.deleteById(tempFile.getFileId());

session.setAttribute(“imgPath”,“user_img/”+id+“.jpg”);

session.setAttribute(“url”,url);

session.setAttribute(“msg”,“上传成功,扫码/访问链接 即可下载!”);

return “redirect:/temp-file”;

} catch (Exception e) {

e.printStackTrace();

}else {

logger.info(“临时文件数据库写入失败!”+name);

session.setAttribute(“url”,“error”);

session.setAttribute(“msg”, “服务器出错了,临时文件上传失败!”);

}else{

//上传失败

logger.info(“临时文件上传失败!”+name);

session.setAttribute(“url”,“error”);

session.setAttribute(“msg”, “服务器出错了,上传失败!”);

} catch (IOException e) {

e.printStackTrace();

return “redirect:/temp-file”;

/**

  • @Descriiption 网盘的文件上传

  • @Author xw

  • @Date 23:10 2020/2/10

  • @Param [files]

  • @return java.util.Map<java.lang.String,java.lang.Object>

**/

@PostMapping(“/uploadFile”)

@ResponseBody

public Map<String, Object> uploadFile(@RequestParam(“file”) MultipartFile files) {

Map<String, Object> map = new HashMap<>();

if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() != 0){

logger.error(“用户没有上传文件的权限!上传失败…”);

map.put(“code”, 499);

return map;

FileStore store = fileStoreService.getFileStoreByUserId(loginUser.getUserId());

Integer folderId = Integer.valueOf(request.getHeader(“id”));

String name = files.getOriginalFilename().replaceAll(" “,”");

//获取当前目录下的所有文件,用来判断是否已经存在

List myFiles = null;

if (folderId == 0){

//当前目录为根目录

myFiles = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId());

}else {

//当前目录为其他目录

myFiles = myFileService.getFilesByParentFolderId(folderId);

for (int i = 0; i < myFiles.size(); i++) {

if ((myFiles.get(i).getMyFileName()+myFiles.get(i).getPostfix()).equals(name)){

logger.error(“当前文件已存在!上传失败…”);

map.put(“code”, 501);

return map;

SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd”);

String dateStr = format.format(new Date());

String path = loginUser.getUserId()+“/”+dateStr +“/”+folderId;

if (!checkTarget(name)){

logger.error(“上传失败!文件名不符合规范…”);

map.put(“code”, 502);

return map;

Integer sizeInt = Math.toIntExact(files.getSize() / 1024);

//是否仓库放不下该文件

if(store.getCurrentSize()+sizeInt > store.getMaxSize()){

logger.error(“上传失败!仓库已满。”);

map.put(“code”, 503);

return map;

//处理文件大小

String size = String.valueOf(files.getSize()/1024.0);

int indexDot = size.lastIndexOf(“.”);

size = size.substring(0,indexDot);

int index = name.lastIndexOf(“.”);

String tempName = name;

String postfix = “”;

int type = 4;

if (index!=-1){

tempName = name.substring(index);

name = name.substring(0,index);

//获得文件类型

type = getType(tempName.toLowerCase());

postfix = tempName.toLowerCase();

try {

//提交到FTP服务器

boolean b = FtpUtil.uploadFile(“/”+path, name + postfix, files.getInputStream());

if (b){

//上传成功

logger.info(“文件上传成功!”+files.getOriginalFilename());

//向数据库文件表写入数据

myFileService.addFileByFileStoreId(

MyFile.builder()

.myFileName(name).fileStoreId(loginUser.getFileStoreId()).myFilePath(path)

.downloadTime(0).uploadTime(new Date()).parentFolderId(folderId).

size(Integer.valueOf(size)).type(type).postfix(postfix).build());

//更新仓库表的当前大小

fileStoreService.addSize(store.getFileStoreId(),Integer.valueOf(size));

try {

Thread.sleep(5000);

map.put(“code”, 200);

} catch (InterruptedException e) {

e.printStackTrace();

}else{

logger.error(“文件上传失败!”+files.getOriginalFilename());

map.put(“code”, 504);

} catch (IOException e) {

e.printStackTrace();

return map;

/**

  • @Descriiption 网盘的文件下载

  • @Author xw

  • @Date 23:13 2020/2/10

  • @Param [fId]

  • @return void

**/

@GetMapping(“/downloadFile”)

public String downloadFile(@RequestParam Integer fId){

if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() == 2){

logger.error(“用户没有下载文件的权限!下载失败…”);

return “redirect:/error401Page”;

//获取文件信息

MyFile myFile = myFileService.getFileByFileId(fId);

String remotePath = myFile.getMyFilePath();

String fileName = myFile.getMyFileName()+myFile.getPostfix();

try {

//去FTP上拉取

OutputStream os = new BufferedOutputStream(response.getOutputStream());

response.setCharacterEncoding(“utf-8”);

// 设置返回类型

response.setContentType(“multipart/form-data”);

// 文件名转码一下,不然会出现中文乱码

response.setHeader(“Content-Disposition”, “attachment;fileName=” + URLEncoder.encode(fileName, “UTF-8”));

boolean flag = FtpUtil.downloadFile(“/” + remotePath, fileName, os);

if (flag) {

myFileService.updateFile(

MyFile.builder().myFileId(myFile.getMyFileId()).downloadTime(myFile.getDownloadTime() + 1).build());

os.flush();

os.close();

logger.info(“文件下载成功!” + myFile);

} catch (Exception e) {

e.printStackTrace();

return “success”;

/**

  • @Descriiption 删除文件

  • @Author xw

  • @Date 23:14 2020/2/10

  • @Param [fId, folder]

  • @return java.lang.String

**/

@GetMapping(“/deleteFile”)

public String deleteFile(@RequestParam Integer fId,Integer folder){

//获得文件信息

MyFile myFile = myFileService.getFileByFileId(fId);

String remotePath = myFile.getMyFilePath();

String fileName = myFile.getMyFileName()+myFile.getPostfix();

//从FTP文件服务器上删除文件

boolean b = FtpUtil.deleteFile(“/”+remotePath, fileName);

if (b){

//删除成功,返回空间

fileStoreService.subSize(myFile.getFileStoreId(),Integer.valueOf(myFile.getSize()));

//删除文件表对应的数据

myFileService.deleteByFileId(fId);

logger.info(“删除文件成功!”+myFile);

return “redirect:/files?fId=”+folder;

/**

  • @Descriiption 删除文件夹并清空文件

  • @Author xw

  • @Date 15:22 2020/2/12

  • @Param [fId]

  • @return java.lang.String

**/

@GetMapping(“/deleteFolder”)

public String deleteFolder(@RequestParam Integer fId){

FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId);

//强制删除

deleteFolderF(folder);

return folder.getParentFolderId() == 0?“redirect:/files”:“redirect:/files?fId=”+folder.getParentFolderId();

/**

  • @Descriiption 迭代删除文件夹里面的所有文件和子文件夹

  • @Author xw

  • @Date 9:17 2020/2/29

  • @Param [folder]

  • @return void

**/

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());

/**

  • @Descriiption 添加文件夹

  • @Author xw

  • @Date 23:16 2020/2/10

  • @Param [folder, map]

  • @return java.lang.String

**/

@PostMapping(“/addFolder”)

public String addFolder(FileFolder folder,Map<String, Object> map) {

//设置文件夹信息

folder.setFileStoreId(loginUser.getFileStoreId());

folder.setTime(new Date());

//获得当前目录下的所有文件夹,检查当前文件夹是否已经存在

List fileFolders = null;

if (folder.getParentFolderId() == 0){

//向用户根目录添加文件夹

fileFolders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());

}else{

//向用户的其他目录添加文件夹

fileFolders = fileFolderService.getFileFolderByParentFolderId(folder.getParentFolderId());

for (int i = 0; i < fileFolders.size(); i++) {

FileFolder fileFolder = fileFolders.get(i);

if (fileFolder.getFileFolderName().equals(folder.getFileFolderName())){

logger.info(“添加文件夹失败!文件夹已存在…”);

return “redirect:/files?error=1&fId=”+folder.getParentFolderId();

//向数据库写入数据

Integer integer = fileFolderService.addFileFolder(folder);

logger.info(“添加文件夹成功!”+folder);

return “redirect:/files?fId=”+folder.getParentFolderId();

/**

  • @Descriiption 重命名文件夹

  • @Author xw

  • @Date 23:18 2020/2/10

  • @Param [folder, map]

  • @return java.lang.String

**/

@PostMapping(“/updateFolder”)

public String updateFolder(FileFolder folder,Map<String, Object> map) {

//获得文件夹的数据库信息

FileFolder fileFolder = fileFolderService.getFileFolderByFileFolderId(folder.getFileFolderId());

fileFolder.setFileFolderName(folder.getFileFolderName());

//获得当前目录下的所有文件夹,用于检查文件夹是否已经存在

List fileFolders = fileFolderService.getFileFolderByParentFolderId(fileFolder.getParentFolderId());

for (int i = 0; i < fileFolders.size(); i++) {

FileFolder folder1 = fileFolders.get(i);

if (folder1.getFileFolderName().equals(folder.getFileFolderName()) && folder1.getFileFolderId() != folder.getFileFolderId()){

logger.info(“重命名文件夹失败!文件夹已存在…”);

return “redirect:/files?error=2&fId=”+fileFolder.getParentFolderId();

//向数据库写入数据

Integer integer = fileFolderService.updateFileFolderById(fileFolder);

logger.info(“重命名文件夹成功!”+folder);

return “redirect:/files?fId=”+fileFolder.getParentFolderId();

/**

  • @Descriiption 重命名文件

  • @Author xw

  • @Date 12:47 2020/2/12

  • @Param [file, map]

  • @return java.lang.String

**/

@PostMapping(“/updateFileName”)

public String updateFileName(MyFile file,Map<String, Object> map) {

MyFile myFile = myFileService.getFileByFileId(file.getMyFileId());

if (myFile != null){

String oldName = myFile.getMyFileName();

String newName = file.getMyFileName();

if (!oldName.equals(newName)){

boolean b = FtpUtil.reNameFile(myFile.getMyFilePath() + “/” + oldName+myFile.getPostfix(), myFile.getMyFilePath() + “/” + newName+myFile.getPostfix());

if (b){

Integer integer = myFileService.updateFile(

MyFile.builder().myFileId(myFile.getMyFileId()).myFileName(newName).build());

if (integer == 1){

logger.info(“修改文件名成功!原文件名:”+oldName+" 新文件名:"+newName);

}else{

logger.error(“修改文件名失败!原文件名:”+oldName+" 新文件名:"+newName);

return “redirect:/files?fId=”+myFile.getParentFolderId();

/**

  • @Descriiption 获得二维码

  • @Author xw

  • @Date 15:20 2020/2/12

  • @Param [id, url]

  • @return java.util.Map<java.lang.String,java.lang.Object>

**/

@GetMapping(“getQrCode”)

@ResponseBody

public Map<String,Object> getQrCode(@RequestParam Integer id,@RequestParam String url){

Map<String,Object> map = new HashMap<>();

map.put(“imgPath”,“https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg”);

if (id != null){

MyFile file = myFileService.getFileByFileId(id);

if (file != null){

try {

String path = request.getSession().getServletContext().getRealPath(“/user_img/”);

url = url+“/file/share?t=”+ UUID.randomUUID().toString().substring(0,10) +“&f=”+file.getMyFileId()+“&p=”+file.getUploadTime().getTime()+“”+file.getSize()+“&flag=1”;

File targetFile = new File(path, “”);

if (!targetFile.exists()) {

targetFile.mkdirs();

File f = new File(path, id + “.jpg”);

if (!f.exists()){

//文件不存在,开始生成二维码并保存文件

OutputStream os = new FileOutputStream(f);

QRCodeUtil.encode(url, “/static/img/logo.png”, os, true);

os.close();

map.put(“imgPath”,“user_img/”+id+“.jpg”);

map.put(“url”,url);

} catch (Exception e) {

e.printStackTrace();

return map;

/**

  • @Descriiption 分享文件

  • @Author xw

  • @Date 14:23 2020/2/12

  • @Param [fId]

  • @return void

**/

@GetMapping(“/file/share”)

public String shareFile(Integer f,String p,String t,Integer flag){

String fileNameTemp = “”;

String remotePath = “”;

String fileName = “”;

Integer times = 0;

if (flag == null || f == null || p == null || t == null){

logger.info(“下载分享文件失败,参数错误”);

return “redirect:/error400Page”;

if(flag == 1){

//获取文件信息

MyFile myFile = myFileService.getFileByFileId(f);

if (myFile == null){

return “redirect:/error404Page”;

String pwd = myFile.getUploadTime().getTime()+“”+myFile.getSize();

if (!pwd.equals§){

return “redirect:/error400Page”;

remotePath = myFile.getMyFilePath();

fileName = myFile.getMyFileName()+myFile.getPostfix();

}else if(flag == 2){

TempFile tempFile = tempFileService.queryById(f);

if (tempFile == null){

return “redirect:/error404Page”;

Long test = tempFile.getUploadTime().getTime();

String pwd = tempFile.getSize();

if (!pwd.equals§){

return “redirect:/error400Page”;

remotePath = tempFile.getFilePath();

fileName = tempFile.getFileName();

}else {

return “redirect:/error400Page”;

fileNameTemp = fileName;

try {

//解决下载文件时 中文文件名乱码问题

boolean isMSIE = isMSBrowser(request);

if (isMSIE) {

//IE浏览器的乱码问题解决

fileNameTemp = URLEncoder.encode(fileNameTemp, “UTF-8”);

} else {

//万能乱码问题解决

fileNameTemp = new String(fileNameTemp.getBytes(“UTF-8”), “ISO-8859-1”);

//去FTP上拉取

OutputStream os = new BufferedOutputStream(response.getOutputStream());

response.setCharacterEncoding(“utf-8”);

// 设置返回类型

response.setContentType(“multipart/form-data”);

// 文件名转码一下,不然会出现中文乱码

response.setHeader(“Content-Disposition”, “attachment;fileName=” + fileNameTemp);

if (FtpUtil.downloadFile(“/” + remotePath, fileName, os)) {

myFileService.updateFile(

MyFile.builder().myFileId(f).downloadTime(times + 1).build());

os.flush();

os.close();

logger.info(“文件下载成功!”);

} catch (Exception e) {

e.printStackTrace();

return “success”;

/**

  • @Descriiption 根据文件的后缀名获得对应的类型

  • @Author xw

  • @Date 23:20 2020/2/10

  • @Param [type]

  • @return int 1:文本类型 2:图像类型 3:视频类型 4:音乐类型 5:其他类型

**/

public int getType(String type){

if (“.chm”.equals(type)||“.txt”.equals(type)||“.xmind”.equals(type)||“.xlsx”.equals(type)||“.md”.equals(type)

||“.doc”.equals(type)||“.docx”.equals(type)||“.pptx”.equals(type)

||“.wps”.equals(type)||“.word”.equals(type)||“.html”.equals(type)||“.pdf”.equals(type)){

return 1;

}else if (“.bmp”.equals(type)||“.gif”.equals(type)||“.jpg”.equals(type)||“.ico”.equals(type)||“.vsd”.equals(type)

||“.pic”.equals(type)||“.png”.equals(type)||“.jepg”.equals(type)||“.png”.equals(type)||“.webp”.equals(type)

||“.svg”.equals(type)){

return 2;

} else if (“.avi”.equals(type)||“.mov”.equals(type)||“.qt”.equals(type)

||“.asf”.equals(type)||“.rm”.equals(type)||“.navi”.equals(type)||“.wav”.equals(type)

||“.mp4”.equals(type)||“.mkv”.equals(type)||“.webm”.equals(type)){

return 3;

} else if (“.mp3”.equals(type)||“.wma”.equals(type)){

return 4;

} else {

return 5;

/**

  • @Descriiption 正则验证文件名是否合法 [汉字,字符,数字,下划线,英文句号,横线]

  • @Author xw

  • @Date 23:22 2020/2/10

  • @Param [target]

  • @return boolean

**/

public boolean checkTarget(String target) {

final String format = “[^\u4E00-\u9FA5\uF900-\uFA2D\w-_.]”;

Pattern pattern = Pattern.compile(format);

Matcher matcher = pattern.matcher(target);

return !matcher.find();

/**

  • @Descriiption 判断当前浏览器是否为ie

  • @Author xw

  • @Date 22:39 2020/3/5

  • @Param [request]

  • @return boolean

**/

public static boolean isMSBrowser(HttpServletRequest request) {

String[] IEBrowserSignals = {“MSIE”, “Trident”, “Edge”};

String userAgent = request.getHeader(“User-Agent”);

for (String signal : IEBrowserSignals) {

if (userAgent.contains(signal)){

return true;

return false;


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KODExplorer是款开源的Web在线文件管理、代码编辑器。它提供了类windows经典用户界面,一整套在线文件管理、文件预览、编辑、上传下载、在线解压缩、音乐播放功能。让你直接在浏览器端实现web开发、源码文件预览、网站部署的同时拥有与本地操作一样方便、快捷、安全的体验。 完美取代落后的FTP工具:可用于服务器文件管理,支持图片、音乐、视频预览,在线解压缩,文件夹拖拽上传……。 在线编程:支持几乎所有编程语言的在线编辑、代码自动补全(高亮,多光标编辑.堪比本地的sublime) 极佳的操作体验:极其便捷的快捷键支持,让你拥有本地化的体验 中文等多语言支持:中文编码全面兼容,文件编辑自动适配。 超快的速度:全面采用Ajax+Json进行数据通信,毫秒级的响应速度; 全平台兼容性:Win Linux Mac (Apache、Nginx、IIS) 使用场景: 取代古老的FTP,服务端、客户端软件等复杂的安装配置。kod可以一键安装随处使用. 你可以用它来管理你的服务器(备份,在线解压缩,版本发布....) 你可以把他当做管理linux的一个操作系统界面 可以用来作为私有云存储系统,存储你的文件... 当然你也可以用来分享文件 更多场景等你来挖掘!…… 设计理念 传承经典,追求创新,为用户提供方便快捷、安全易用的在线云管理系统。 面向用户 目前KODExplorer系统管理主要定位在个人云主机、中小企业云资源管理、网盘管理、中小型网站管理等。Web开发者&站长(老鸟):在线编辑、压缩备份、部署,经典windows界面操作,上手容易,远离了主机的SSH、ftp复杂枯燥的命令操作。 个人私有云(菜鸟):管理网盘资源,同样经典windows界面操作,可以就地浏览网盘音乐、视屏文件,上传下载快捷方便。 特色 像使用操作系统一样使用体验,右键操作,拖拽,快捷键…… 框中选择,拖拽移动,拖拽上传,在线编辑器,影音播放器,解压缩。全面ajax保证性能和体验! 各个功能直接无缝连接;以对话框形式存在,多任务管理等功能 完备的中文支持,各种情况下乱码解决; 文件管理 文件选择:单选,鼠标框选,shift连选,ctrl随意选择,键盘上下左右、home、end选择。 文件操作:选择文件后,可以进行复制,剪切,删除,属性查看,压缩,重命名,打开预览等操作…… 文件上传:多文件批量上传;html5拖拽上传(拖拽到窗口实现无缝上传) 右键功能:文件右键,文件夹右键,多选后右键操作,桌面右键,树目录右键操作,右键菜单绑定快捷键 (全选——复制——剪切——粘贴——删除——重命名,设置……) 文件浏览:列表模式,图标模式;双击进入子文件夹;地址栏操作;打开文件夹记录逆势操作记录(前进后退) 支持拖拽操作:选中后拖拽,实现剪切到指定文件夹功能 快捷键操作:delete删除,ctrl+A全选,ctrl+C复制,ctrl+X剪切,up/down/left/right/home/end选择文件 在线预览 文件预览:文本文件内容查看编辑保存;html,swf文件预览, 图片预览:自动生成缩略图,图片幻灯片播放; 音频播放:在线播放音乐,视频文件;支持mp3,wma,mid,aac,wav;mp4, 视频播放:在线视频文件播放,支持格式:flv,f4v,3gp 在线编辑 支持60多种代码(数据文件)高亮 支持多标签:同时编辑多份文件,拖动标签可以切换顺序;支持最大化模式 主题切换:选择你喜欢的编程风格 zendcodeing支持,从此爱上在线编程 查找、替换;撤销反撤销,维持历史记录 自动补全[],{},"",';自动换行,自定义字体,代码折叠等诸多实用功能 文件管理器:可以像使用本地我的电脑那样使用它 文件编辑器:支持几乎所有编程语言高亮,支持文档多标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值