In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-02-24 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >
Share
Shulou(Shulou.com)06/02 Report--
This article mainly introduces "Java+Springboot how to build an online disk file sharing system". In daily operation, I believe many people have doubts about how to build an online disk file sharing system in Java+Springboot. The editor consulted all kinds of materials and sorted out simple and easy-to-use methods of operation. I hope it will be helpful to answer the doubts of "how to build an online disk file sharing system in Java+Springboot". Next, please follow the editor to study!
Preface
The function of the online file sharing system implemented by springboot+freemark+jpa+MySQL is very similar to that of Baidu. Ordinary users can register and log in, and 1G of space is allocated by default after registration. After logging in, you can create new folders, upload various types of files, move, copy, download, delete, share, share into private sharing and public sharing, and set the sharing expiration time. After opening the sharing link, you can view, download, save to your own network disk, and so on. After logging in, the Super Admin can set the space size, role type, permissions and so on for ordinary users.
The main features of this system are:
1: the system automatically calculates the MD5 value of the file when uploading the file, and checks whether the value exists. If so, the file is no longer uploaded to the server, but directly references the original file.
2: the timer regularly checks whether the shared files are out of date.
Using technology: java+springboot+freemark+jpa+MySQL+maven
Effect picture
Main Code Manager Controller: / * * @ ClassName: AdminController * @ Description: administrator Controller * * / @ Controllerpublic class AdminController extends BaseController {private Logger logger = LogUtils.getInstance (AdminController.class) / * * @ Description go to the user management page * * / @ GetMapping ("/ manages-users") public String manageUsers (Map map,Integer cur) {if (loginUser.getRole () = = 1) {/ / for no access logger.error ("currently logged in user:" + loginUser.getUserName () + "No administrator privileges!") ; return "redirect:/error401Page";} / / get all users Integer usersCount = userService.getUsersCount (); / / get the number of pages in the current query. If empty, default is 0 cur = (cur = = null | | cur store.getMaxSize ()) {logger.error ("upload failed! the warehouse is full"). ; map.put ("code", 503); return map;} / / processing file size String size = String.valueOf (files.getSize () / 1024.0); int indexDot = size.lastIndexOf ("."); size = size.substring (0indexDot); int index = name.lastIndexOf ("."); String tempName = name; String postfix = "" Int type = 4; if (indexation copyright 1) {tempName = name.substring (index); name = name.substring (0quotient index); / / get the file type type = getType (tempName.toLowerCase ()); postfix = tempName.toLowerCase () } try {/ / submitted to FTP server boolean b = FtpUtil.uploadFile ("/" + path, name + postfix, files.getInputStream ()); if (b) {/ / uploaded successfully logger.info ("File uploaded successfully!" + files.getOriginalFilename ()) / / write data to the database file table myFileService.addFileByFileStoreId (MyFile.builder () .myFileName (name) .fileStoreId (loginUser.getFileStoreId ()) .myFilePath (path) .downloadTime (0) .uploadTime (new Date ()) .fileStoreId (folderId). Size (Integer.valueOf (size)) .type (type) .postfix (postfix). Build (); / update the current size of the warehouse table fileStoreService.addSize (store.getFileStoreId (), Integer.valueOf (size)); try {Thread.sleep (5000); map.put ("code", 200) } catch (InterruptedException e) {e.printStackTrace ();}} else {logger.error ("File upload failed!" + files.getOriginalFilename ()); map.put ("code", 504);} catch (IOException e) {e.printStackTrace () } return map;} / * @ Description file download * * / @ GetMapping ("/ downloadFile") public String downloadFile (@ RequestParam Integer fId) {if (fileStoreService.getFileStoreByUserId (loginUser.getUserId ()). GetPermission () = 2) {logger.error ("users do not have permission to download files! Download failed. "); return" redirect:/error401Page ";} / / get file information MyFile myFile = myFileService.getFileByFileId (fId); String remotePath = myFile.getMyFilePath (); String fileName = myFile.getMyFileName () + myFile.getPostfix (); try {/ / pull OutputStream os = new BufferedOutputStream (response.getOutputStream ()) on FTP Response.setCharacterEncoding ("utf-8"); / / set the return type response.setContentType ("multipart/form-data"); / / Transcode the file name, otherwise Chinese garbled response.setHeader ("Content-Disposition", "attachment;fileName=" + URLEncoder.encode (fileName, "UTF-8") will appear) 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 ("File downloaded successfully!" + myFile);}} catch (Exception e) {e.printStackTrace ();} return "success" } / * * @ Description Delete the file * * / @ GetMapping ("/ deleteFile") public String deleteFile (@ RequestParam Integer fId,Integer folder) {/ / get the file information MyFile myFile = myFileService.getFileByFileId (fId); String remotePath = myFile.getMyFilePath (); String fileName = myFile.getMyFileName () + myFile.getPostfix () / / delete the file boolean b = FtpUtil.deleteFile ("/" + remotePath, fileName) from the FTP file server; if (b) {/ / delete successfully and return the space fileStoreService.subSize (myFile.getFileStoreId (), Integer.valueOf (myFile.getSize (); / / delete the data myFileService.deleteByFileId (fId) corresponding to the file table } logger.info ("File deleted successfully!" + myFile); return "redirect:/files?fId=" + folder;} / * * @ Description Delete the folder and empty the file * * / @ GetMapping ("/ deleteFolder") public String deleteFolder (@ RequestParam Integer fId) {FileFolder folder = fileFolderService.getFileFolderByFileFolderId (fId); / / Force delete deleteFolderF (folder) Return folder.getParentFolderId () = 0? "redirect:/files": "redirect:/files?fId=" + folder.getParentFolderId ();} / * * @ Description iteratively delete all files and subfolders in the folder * * / public void deleteFolderF (FileFolder folder) {/ / get all subfolders under the current folder List folders = fileFolderService.getFileFolderByParentFolderId (folder.getFileFolderId ()) / / Delete all files in the current folder 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 添加文件夹 **/ @PostMapping("/addFolder") public String addFolder(FileFolder folder,Map 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(); } /** * @Description 重命名文件夹 **/ @PostMapping("/updateFolder") public String updateFolder(FileFolder folder,Map 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(); } /** * @Description 重命名文件 **/ @PostMapping("/updateFileName") public String updateFileName(MyFile file,Map 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(); } /** * @Description 获得二维码 **/ @GetMapping("getQrCode") @ResponseBody public Map getQrCode(@RequestParam Integer id,@RequestParam String url){ Map 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; } /** * @Description 分享文件 **/ @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(p)){ 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(p)){ 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"; } /** * @Description 根据文件的后缀名获得对应的类型 * @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)||".jpeg".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; } } /** * @Description 正则验证文件名是否合法 [汉字,字符,数字,下划线,英文句号,横线] **/ 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(); } /** * @Description 判断当前浏览器是否为ie **/ 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; } }登录控制器:/** * @Description 登录控制器 **/@Controllerpublic class LoginController extends BaseController { private Logger logger = LogUtils.getInstance(LoginController.class); /** * @Description 免登陆用户入口,用于本地开发测试,上线运营为了安全请删除此方法 * @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"; } /** * 用于注册流程,用户名,密码,邮箱等校验工作由前端来完成 */ @PostMapping("/register") public String register(User user, String code, Map 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"; } /** * 用户登录 */ @PostMapping("/login") public String login(User user, Map 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 * @Description 向注册邮箱发送验证码, 并验证邮箱是否已使用 **/ @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"; } /** * @Description 请求QQ登录 **/ @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(); } } /** * @Description QQ登录回调地址 **/ @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=>Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.