Java项目:网盘系统设计和实现(java+ssm+jpa)
源码获取:博客首页 "资源" 里下载!
很多同学都有自己的网盘,方便存储一些java学习教程。该毕业设计实现了一个简易的网盘,包含文件上传和文件分享等功能。
后端技术采用了spring,spring mvc,JPA,前端采用了thymeleaf模板语言。整体业务功能相对不是太复杂,亮点是文件分享功能。
分享操作业务:
@Controller
public class ShareController {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate LinkSecretServiceImpl linkSecretService;@Autowiredprivate FileServiceImpl fileService;private SaveServiceImpl saveService;/*** 安卓上查看分享记录的接口** @return*/@RequestMapping(value = "/shareRecord", produces = "application/json; charset=utf-8")@ResponseBodypublic List<ShareMessage> shareRecord(HttpServletRequest request) {User user = (User) request.getSession().getAttribute("user");String userName = user.getUserName();List<ShareMessage> shareMessageList = new ArrayList<>();List<LinkSecret> linkSecretList = linkSecretService.findLinkSecretsByUserName(userName);for (int i = 0; i < linkSecretList.size(); i++) {LinkSecret linkSecret = linkSecretList.get(i);ShareMessage shareMessage = new ShareMessage();shareMessage.setDownloadNum(linkSecret.getDownloadNum());shareMessage.setExpireDate(linkSecret.getExpireDate());shareMessage.setFileName(linkSecret.getLocalLink().substring(linkSecret.getLocalLink().lastIndexOf("/")));shareMessage.setDownloadName(null);shareMessageList.add(shareMessage);}return shareMessageList;}//保存到网盘-----link是加密的链接 downloadLink解密后的链接/data/share/zc2/Fuck.java, path:保存路径--是用户名后面的路径@RequestMapping(value = "/shareToMyPan")@ResponseBodypublic ResponseMsg shareToMyPan(HttpServletRequest request, String path, String link) {String downloadLink = "";if (link.contains("/data/share")) {downloadLink = link;} else {downloadLink = fileService.fileShareCodeDecode(link);}logger.warn("downloadLink:" + downloadLink);boolean b = false;ResponseMsg responseMsg = new ResponseMsg();User user = (User) request.getSession().getAttribute("user");if (user == null) {responseMsg.setSuccess(false);responseMsg.setMsg("未登录");} else {String userName = user.getUserName();if (path == null) {path = "/";}logger.warn(userName + " " + downloadLink + " " + path);b = fileService.copyFileToMyPan(userName, downloadLink, path);responseMsg.setSuccess(b);if (b == false) {responseMsg.setMsg("保存失败");} else {responseMsg.setMsg("保存成功");}}return responseMsg;}/*** 下载客户端的apk* filename:下载apk的名字* downloadPath:下载的文件夹,放在/root/pan/share目录中*/@RequestMapping(value = "/downloadApk", produces = {"application/json; charset=UTF-8"})@ResponseBodypublic ResponseMsg shareToMyPan(HttpServletRequest request, HttpServletResponse response, String filename,String downloadPath) throws FileNotFoundException, UnsupportedEncodingException {// 读到流中// String filePath="F:/"+downloadPath+"/"+filename;//window上测试的路径ResponseMsg responseMsg = new ResponseMsg();String filePath = fileRootPath + downloadPath + "/" + filename;InputStream inStream = new FileInputStream(filePath);if (!new File(filePath).exists()) {responseMsg.setMsg("找不到文件");}// 设置输出的格式String agent = request.getHeader("user-agent");String fileName4 = "";if (agent.contains("Firefox")) {fileName4 = new String(filename.getBytes(), "iso-8859-1");} else {//空格,(,),;,@,#,&,逗号在谷歌浏览器中出现乱码fileName4 = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20").replaceAll("%28", "\\(").replaceAll("%29", "\\)").replaceAll("%3B", ";").replaceAll("%40", "@").replaceAll("%23", "\\#").replaceAll("%26", "\\&").replaceAll("%2C", "\\,");}response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName4 + "\"");// 循环取出流中的数据byte[] b = new byte[100];int len;try {while ((len = inStream.read(b)) > 0) {response.getOutputStream().write(b, 0, len);}inStream.close();responseMsg.setSuccess(true);} catch (IOException e) {logger.error("Exception:", e);responseMsg.setSuccess(false);}return responseMsg;}}
登录业务控制器:
/*** 登录* 管理员admin 密码123 权限0(最高)**/
@Controller
public class LoginController {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate IUserService userService;@Autowiredprivate IVerifyCodeService iVerifyCodeService;// 登录@RequestMapping(value = "/login", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> login(HttpServletRequest request, HttpServletResponse response) {Map<String, Object> map = new HashMap<>();String userName = request.getParameter("userName");String password = request.getParameter("password");String encryptedPwd = "";try {//加密的用户密码encryptedPwd = Md5SaltTool.getEncryptedPwd(password);logger.warn("encryptedPwd:" + encryptedPwd);} catch (NoSuchAlgorithmException e) {logger.error("Exception:", e);} catch (UnsupportedEncodingException e) {logger.error("Exception:", e);}User dataBaseUser = userService.queryUserByUsername(userName);if (dataBaseUser != null && encryptedPwd.equals(dataBaseUser.getPassWord())) {User user = new User(userName, encryptedPwd, dataBaseUser.getLevelType(), dataBaseUser.getEmail(),dataBaseUser.getPhone(), dataBaseUser.getAlias());request.getSession().setAttribute("user", user);logger.info("用户登录成功!");map.put("result", "1");map.put("userName", userName);} else if (dataBaseUser != null && !encryptedPwd.equals(dataBaseUser.getPassWord())) {logger.info("密码错误!");map.put("result", "2");} else {logger.info("用户不存在!");map.put("result", "0");}return map;}// 退出登录@RequestMapping(value = "/quit", method = RequestMethod.GET)public String loginOut(HttpServletRequest request) {if (!SystemUtil.isWindows()) {// 非windows环境下要删除用户文件FileUtil.deleteDir(fileRootPath + WebUtil.getUserNameByRequest(request));}// 清除sessionrequest.getSession().invalidate();logger.info("退出登录成功!");return "login";}// 注册@RequestMapping(value = "/signin", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> signin(@RequestParam(required = false) String alias,@RequestParam(required = true) String userName, @RequestParam(required = true) String password,@RequestParam(required = false) String regcode, @RequestParam(required = false) String email,@RequestParam(required = false) String phone, HttpServletRequest request, HttpServletResponse response) {Map<String, Object> map = new HashMap<>();String encryptedPwd = "";try {//加密的用户密码encryptedPwd = Md5SaltTool.getEncryptedPwd(password);} catch (NoSuchAlgorithmException e) {logger.error("NoSuchAlgorithmException:", e);} catch (UnsupportedEncodingException e) {logger.error("UnsupportedEncodingException:", e);}User dataBaseUser = userService.queryUserByUsername(encryptedPwd);//regcode的重新写入if (!iVerifyCodeService.isValid(regcode)) {logger.info("注册失败,激活码失效或不正确!");map.put("result", "2");return map;} else {if (dataBaseUser == null) {User user = new User(userName, encryptedPwd, "0", email, phone, alias);userService.add(user);logger.info("账号注册成功!");map.put("result", "1");} else {logger.info("用户已经存在,请登录或换一个用户名!");map.put("result", "0");}return map;}}@RequestMapping(value = "/username", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg fileRename(HttpServletRequest request) {ResponseMsg j = new ResponseMsg();// 获取用户名User user = (User) request.getSession().getAttribute("user");String userName = user.getUserName();if (userName == null) {userName = "null";}j.setMsg(userName);j.setSuccess(true);return j;}@RequestMapping(value = "/getUserByUserName")@ResponseBodypublic User getUserByUserName(HttpServletRequest request) {User user = (User) request.getSession().getAttribute("user");return user;}//更新当前用户信息@RequestMapping(value = "/updateUserByUserName")@ResponseBodypublic ResponseMsg updateUserByUserName(@RequestParam(required = false) String username,@RequestParam(required = false) String alias, @RequestParam(required = false) String password,@RequestParam(required = false) String email, @RequestParam(required = false) String phone,HttpServletRequest request) {ResponseMsg j = new ResponseMsg();User user = (User) request.getSession().getAttribute("user");if (username != null) {user.setUserName(username);}if (alias != null) {user.setAlias(alias);}if (password != null) {try {String encryptedPwd = Md5SaltTool.getEncryptedPwd(password);user.setPassWord(encryptedPwd);} catch (NoSuchAlgorithmException e) {logger.error("NoSuchAlgorithmException:", e);} catch (UnsupportedEncodingException e) {logger.error("UnsupportedEncodingException:", e);}}if (email != null) {user.setEmail(email);}if (phone != null) {user.setPhone(phone);}userService.update(user);j.setMsg("更新用户信息成功!");j.setSuccess(true);return j;}//检查是否是登录状态@RequestMapping(value = "/islogin")@ResponseBodypublic ResponseMsg isLogin(@RequestParam(required = false) String savePath, HttpServletRequest request) {if (savePath == null) {savePath = "/";}ResponseMsg j = new ResponseMsg();// 获取用户名User user = (User) request.getSession().getAttribute("user");if (user == null) {//未登录,跳转到登录界面,登录之后默认保存到网盘连接的地址<a href="wut://pan">链接到app</a>j.setMsg("未登录");j.setSuccess(false);} else {j.setMsg("已登录");j.setSuccess(true);}return j;}
}
文件管理业务:
/*** 文件管理***/
@Controller
public class FileController {public static String fileRootPath;public static String tempPath; // 分块文件临时存储地址//MD5文件的大小public static int size;private static int secretLen;// 秘钥private static String key;private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate IFileService fileService;@Autowiredprivate LinkSecretServiceImpl linkSecretService;@Autowiredprivate SaveServiceImpl saveService;@Value("${key}")public void setKey(String key) {FileController.key = key;}@Value("${tempPath}")public void setTempPath(String tempPath) {FileController.tempPath = tempPath;}@Value("${fileRootPath}")public void setFileRootPath(String fileRootPath) {FileController.fileRootPath = fileRootPath;}@Value("${secretLen}")public void setSecretLen(int secretLen) {FileController.secretLen = secretLen;}@Value("${size}")public void setSize(int size) {FileController.size = size;}// 文件上传@RequestMapping(value = "/upload", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg upload(@RequestParam MultipartFile file, String path, HttpServletRequest request) {if (path == null) {path = "/";}ResponseMsg j = new ResponseMsg();if (file.isEmpty()) {j.setMsg("请选择要上传的文件!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// 上传文件boolean b = fileService.upload(file, userName, path);// 反馈用户信息if (b) {j.setSuccess(true);j.setMsg("上传成功!");} else {j.setMsg("上传失败!");}return j;}// 文件下载@RequestMapping(value = "/download", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsgAdd download(@RequestParam String fileName, String path, HttpServletRequest request) {if (path == null) {path = "/";}ResponseMsgAdd j = new ResponseMsgAdd();if (fileName.isEmpty()) {j.setMsg("文件名字为空!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// String userName ="zc";// 下载文件,获取下载路径,这个是 个映射的路径String link = fileService.download(fileName, userName, path);try {//这里校验要填真实的路经String newLink = link.replace("/data/", fileRootPath);String[] md5Array = FileSplit.splitBySizeSubSection(newLink, size,fileRootPath + "/tempMd5/" + userName + "/");j.setObj(md5Array);} catch (Exception e) {logger.error("Exception:", e);j.setObj("");}if (!link.isEmpty()) {j.setSuccess(true);j.setMsg(link);} else {j.setMsg("");logger.warn("下载失败");}return j;}// 搜索接口@RequestMapping(value = "/search", produces = "application/json; charset=utf-8")@ResponseBodypublic List<FileMsg> search(@RequestParam String key, String path, HttpServletRequest request) {if (path == null) {path = "/";}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);List<FileMsg> fileMsgList = fileService.search(key, userName, path);// 判断文件转码情况for (FileMsg fileMsg : fileMsgList) {// 跳过文件夹if (fileMsg.getSize().equals("Directory")) {continue;}// 正常文件int suffixidx = (int) StringUtil.getfilesuffix(fileMsg.getName(), true);String suffix = fileMsg.getName().substring(suffixidx);if (suffix.equals("mkv") || suffix.equals("rmvb") || suffix.equals("avi") || suffix.equals("wmv")|| suffix.equals("3gp") || suffix.equals("rm")) {// 取非文件夹的所有文件名List<String> namelist = fileMsgList.stream().filter(f -> !f.getSize().equals("Directory")).map(FileMsg::getName).collect(Collectors.toList());// 含有转码文件的情况下if (namelist.contains(fileMsg.getName().substring(0, suffixidx) + "mp4")) {Map<String, Object> map = FfmpegUtil.ffmpegTaskMap.get(fileMsg.getLink());// 含有转码文件且有转码记录if (null != map) {String transcode = (String) map.get("flag");fileMsg.setTranscode(transcode);}// 含有转码文件但没有转码记录,说明之前已完成转码else {fileMsg.setTranscode("complete");}}// 没有转码文件说明可转码else {fileMsg.setTranscode("transcodable");}}}return fileMsgList;}// 用户根目录文件列出@RequestMapping(value = "/userfilelist", produces = "application/json; charset=utf-8")@ResponseBodypublic List<FileMsg> userFileList(@RequestParam(required = false) String key, String path,HttpServletRequest request) {if (path == null) {path = "/";}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// 列出用户文件List<FileMsg> fileMsgList = fileService.userFileList(userName, path);// 判断文件转码情况for (FileMsg fileMsg : fileMsgList) {// 跳过文件夹if (fileMsg.getSize().equals("Directory")) {continue;}// 正常文件int suffixidx = (int) StringUtil.getfilesuffix(fileMsg.getName(), true);String suffix = fileMsg.getName().substring(suffixidx);if (suffix.equals("mkv") || suffix.equals("rmvb") || suffix.equals("avi") || suffix.equals("wmv")|| suffix.equals("3gp") || suffix.equals("rm")) {// 取非文件夹的所有文件名List<String> namelist = fileMsgList.stream().filter(f -> !f.getSize().equals("Directory")).map(FileMsg::getName).collect(Collectors.toList());// 含有转码文件的情况下if (namelist.contains(fileMsg.getName().substring(0, suffixidx) + "mp4")) {Map<String, Object> map = FfmpegUtil.ffmpegTaskMap.get(fileMsg.getLink());// 含有转码文件且有转码记录if (null != map) {String transcode = (String) map.get("flag");fileMsg.setTranscode(transcode);}// 含有转码文件但没有转码记录,说明之前已完成转码else {fileMsg.setTranscode("complete");}}// 没有转码文件说明可转码else {fileMsg.setTranscode("transcodable");}}}return fileMsgList;}// 查看单个文件转码状态@RequestMapping(value = "/transcodestatus", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg transCodeStatus(String path, HttpServletRequest request) {if (path == null) {path = "/";}logger.warn("transCodeStatus():" + path);logger.warn("ffmpegTaskMap:" + JSONObject.toJSONString(FfmpegUtil.ffmpegTaskMap));ResponseMsg responseMsg = new ResponseMsg();responseMsg.setMsg("noneed");responseMsg.setSuccess(true);// 判断文件转码情况Map<String, Object> map = FfmpegUtil.ffmpegTaskMap.get(path);if (null != map) {Boolean transcode = (Boolean) map.get("flag");if (transcode) {responseMsg.setMsg("complete");} else {responseMsg.setMsg("transcoding");}}return responseMsg;}// 文件删除@RequestMapping(value = "/filedelete", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg fileDelete(String fileName, String path, HttpServletRequest request) {if (path == null) {path = "/";}ResponseMsg j = new ResponseMsg();if (fileName.isEmpty()) {j.setMsg("文件名字为空!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// 删除文件Boolean[] b = fileService.userFileDelete(fileName, userName, path);boolean flag = true;for (int i = 0; i < b.length; i++) {if (b[i] == false) {flag = false;}}if (flag) {j.setSuccess(true);j.setMsg("删除成功!");} else {j.setMsg("删除失败!");}return j;}// 文件重命名 文件夹重命名时 老名字写path 新名字写newName oldName填@dir@@RequestMapping(value = "/filerename", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg fileRename(String oldName, String newName, String path, HttpServletRequest request) {if (path == null) {path = "/";}ResponseMsg j = new ResponseMsg();if (oldName.isEmpty() || newName.isEmpty()) {j.setMsg("文件名字为空!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// 重命名文件boolean b = fileService.userFileRename(oldName, newName, userName, path);String saveFilePath = fileRootPath + userName + "/" + path;String oldNameWithPath = saveFilePath + "/" + oldName;File file = new File(oldNameWithPath);if (b) {j.setSuccess(true);j.setMsg("重命名成功!");logger.warn(j.getMsg());} else if (!file.exists()) {j.setMsg("没有重命名的权限!");logger.warn(j.getMsg());} else {j.setMsg("重命名失败!");logger.warn(j.getMsg());}return j;}// 文件夹创建@RequestMapping(value = "/dircreate", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg dirCreate(String dirName, String path, HttpServletRequest request) {if (path == null) {path = "/";}ResponseMsg j = new ResponseMsg();if (dirName.isEmpty() || path.isEmpty()) {j.setMsg("文件夹名字为空!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// path = /pan/userName/当前pathif (!SystemUtil.isWindows()) {path = "/pan/" + userName + path;} else {path = fileRootPath + userName + path;}// 重命名文件boolean b = fileService.userDirCreate(dirName, path);if (b) {j.setSuccess(true);j.setMsg("文件夹创建成功!");} else {j.setMsg("文件夹创建失败!");}return j;}// 文件提取码->真实地址(验证提取码是否正确)@RequestMapping(value = "/shareCallBack", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg shareCallBack(String link) {logger.warn("执行shareCallBack接口!:" + link);ResponseMsg j = new ResponseMsg();if (link.isEmpty()) {j.setMsg("提取码为空!");return j;}String downloadLink = fileService.fileShareCodeDecode(link);logger.warn("downloadLink:" + downloadLink);if (!"null".equals(downloadLink)) {j.setSuccess(true);j.setMsg(downloadLink);} else {j.setMsg("提取码不正确!");}return j;}// 文件分享下载地址sharefile(创建链接)-----share(定位到分享页面)-shareCallBack(验证提取码是否正确)@RequestMapping(value = "/sharefile", produces = "application/json; charset=utf-8")@ResponseBodypublic ModelAndView shareFile(String link) {logger.warn("shareFie接口的运行!");String downloadLink = "";if (!link.isEmpty()) {// downloadLink= fileService.fileShareCodeDecode(link);downloadLink = link;}//在数据库查找这个链接logger.warn("zc1+downloadLink:" + downloadLink);LinkSecret linkSecret = linkSecretService.findLinkSecretBysecretLink(downloadLink);if (linkSecret == null) {ModelAndView modelAndView = new ModelAndView("errorPage");modelAndView.addObject("message", "链接失效");return modelAndView;} else {Date date1 = linkSecret.getExpireDate();//表示链接永久有效if (date1 == null) {ModelAndView modelAndView = new ModelAndView("shareSecret");modelAndView.addObject("link", link);return modelAndView;} else {//得到long类型当前时间long dataTemp = System.currentTimeMillis();Date date2 = new Date(dataTemp);if (date1.before(date2)) {//不能下载ModelAndView modelAndView = new ModelAndView("errorPage");modelAndView.addObject("message", link + "链接失效");//删除本地共享文件夹的内容FileUtil.delete(downloadLink);return modelAndView;} else {ModelAndView modelAndView = new ModelAndView("shareSecret");modelAndView.addObject("link", link);return modelAndView;}}}}//定位到分享页面@RequestMapping("/share")public ModelAndView share(String link, HttpServletRequest request) {logger.warn("zzc:" + link);EncryptUtil des = null;String linkDecoder = "";try {des = new EncryptUtil(key, "utf-8");linkDecoder = des.decode(link);} catch (Exception e) {logger.error("Exception:", e);}ModelAndView modelAndView = new ModelAndView("share");modelAndView.addObject("link", link);modelAndView.addObject("linkDecoder", linkDecoder);User user = (User) request.getSession().getAttribute("user");if (user != null) {modelAndView.addObject("author", user.getUserName());}return modelAndView;}@RequestMapping("/errorPage")public ModelAndView errorPage(String message) {logger.warn("zzc:" + message);ModelAndView modelAndView = new ModelAndView("errorPage");modelAndView.addObject("message", message);return modelAndView;}@RequestMapping(value = "/sharefileSecret", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg shareFileSecret(String link, String secret, HttpServletRequest request,HttpServletResponse response) {logger.warn("执行sharefileSecret接口");String downloadLink = "";Map<Object, String> map = new HashMap<>();if (!link.isEmpty()) {// downloadLink= fileService.fileShareCodeDecode(link);downloadLink = link;}//在数据库查找这个链接LinkSecret linkSecret = linkSecretService.findLinkSecretBysecretLink(downloadLink);String secret1 = linkSecret.getSecret();if (secret1.toLowerCase().equals(secret.toLowerCase())) {linkSecretService.addOneToDownloadNum(linkSecret);logger.warn("密码正确!");logger.warn("codeArray[1]路径:" + link);ResponseMsg responseMsg = new ResponseMsg();responseMsg.setSuccess(true);responseMsg.setMsg(link);return responseMsg;} else {logger.warn("密码不正确!");ResponseMsg responseMsg = new ResponseMsg();responseMsg.setSuccess(false);responseMsg.setMsg("密码不正确!");return responseMsg;}}// 文件提取码生成,当再次分享同一个文件,只更新过期时间@RequestMapping(value = "/generateShareLink", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg generateShareLink(@RequestParam String expireDay, String fileName, String path,HttpServletRequest request) {String expireDayString = expireDay;int expireDays = 3;if (expireDayString != null) {if (expireDayString.equals("永久有效")) {expireDays = -1;} else {expireDays = Integer.parseInt(expireDayString);}}if (path == null) {path = "/";}ResponseMsg j = new ResponseMsg();if (fileName.isEmpty() || path.isEmpty()) {j.setMsg("文件夹名字为空!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);String filePathAndName = userName + "/" + path + "/" + fileName;filePathAndName = StringUtil.stringSlashToOne(filePathAndName);logger.warn("filePathAndName:" + filePathAndName);String b = fileService.fileShareCodeEncode(filePathAndName);String secret = "";File file = new File(fileRootPath + "/" + filePathAndName);String localLink = "/data/share/" + filePathAndName;//存入数据库LinkSecret linkSecret = linkSecretService.findLinkSecretByLocalLinkAndUserName(localLink, userName);if (linkSecret == null) {//设置提取密码secret = PassWordCreate.createPassWord(secretLen);linkSecret = new LinkSecret();linkSecret.setLocalLink(localLink);linkSecret.setSecret(secret);linkSecret.setUserName(userName);linkSecret.setDownloadNum(0);linkSecret.setFileName(fileName);if (expireDays != -1) {Calendar cal = Calendar.getInstance();cal.add(Calendar.DATE, expireDays);Date date = cal.getTime();linkSecret.setExpireDate(date);}logger.warn("b:" + b);linkSecret.setSecretLink(b);linkSecretService.save(linkSecret);//testLinkSecret linkSecretTemp = linkSecretService.findLinkSecretByLocalLinkAndUserName(localLink, userName);logger.warn(linkSecretTemp.getSecretLink());//test} else {if (expireDays != -1) {Calendar cal = Calendar.getInstance();cal.add(Calendar.DATE, expireDays);Date date = cal.getTime();linkSecretService.updateExpireDay(linkSecret, date);linkSecretService.updateShareDate(linkSecret, new Date());secret = linkSecret.getSecret();} else {linkSecretService.updateExpireDay(linkSecret, null);secret = linkSecret.getSecret();linkSecretService.updateShareDate(linkSecret, new Date());}}if (SystemUtil.isWindows()) {b = linkSecret.getSecretLink() + "##" + secret;} else {b = b + "##" + secret;}if (!"null".equals(b)) {j.setSuccess(true);j.setMsg(b);} else {j.setMsg("提取码生成失败!");}return j;}// 文件、文件夹 移动 文件夹移动时fileName=@dir@@RequestMapping(value = "/filemove", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseMsg fileMove(String fileName, String oldPath, String newPath, HttpServletRequest request) {if (fileName == null) {fileName = "@dir@";}ResponseMsg j = new ResponseMsg();if (oldPath.isEmpty() || newPath.isEmpty()) {j.setMsg("路径名字为空!");return j;}// 获取用户名String userName = WebUtil.getUserNameByRequest(request);// 移动文件boolean b = fileService.userFileDirMove(fileName, oldPath, newPath, userName);if (b) {j.setSuccess(true);j.setMsg("移动成功!");} else {j.setMsg("移动失败!");}return j;}/*** 分块上传 有断点续传的功能** @param request* @param response* @param file* @param path*/@RequestMapping(value = "/uploadsevlet", method = RequestMethod.POST)@ResponseBodypublic void uploadSevlet(HttpServletRequest request, HttpServletResponse response, MultipartFile file,String path) {// String fileMd5 = request.getParameter("fileMd5");String chunk = request.getParameter("chunk");logger.warn("chunk:" + chunk);String fileName = file.getOriginalFilename();String userName = WebUtil.getUserNameByRequest(request);MultipartHttpServletRequest Murequest = (MultipartHttpServletRequest) request;Map<String, MultipartFile> files = Murequest.getFileMap();logger.warn("执行前---------");if (null != files && !files.isEmpty()) {for (MultipartFile item : files.values()) {String tempDir = FileUtil.getTempDir(tempPath, userName, fileName);tempDir = StringUtil.stringSlashToOne(tempDir);logger.warn("tempDir:" + tempDir);File dir = new File(tempDir);if (!dir.exists()) {dir.mkdirs();}// 创建分片文件并保存File chunkFile = new File(tempDir + "/" + chunk);logger.warn(tempDir + "/" + chunk);try {chunkFile.createNewFile();item.transferTo(chunkFile);} catch (IllegalStateException e) {logger.warn("保存分片文件出错:" + e.getMessage());logger.error("Exception:", e);} catch (IOException e) {logger.warn("保存分片文件出错:" + e.getMessage());logger.error("Exception:", e);}}}}/*** 上传之前检查** @param request* @param response* @return*/@RequestMapping(value = "/check", method = RequestMethod.POST)@ResponseBodypublic ResponseMsg checkChunk(HttpServletRequest request, HttpServletResponse response) {ResponseMsg responseMsg = new ResponseMsg();logger.warn("执行check-------------------");String fileName = request.getParameter("fileName");// String fileMd5 = request.getParameter("fileMd5");String chunk = request.getParameter("chunk");logger.warn("checkChunk+chunk:" + chunk);String chunkSize = request.getParameter("chunkSize");logger.warn("checkChunk+chunkSize:" + chunkSize);String userName = WebUtil.getUserNameByRequest(request);logger.warn(tempPath);String tempDir = FileUtil.getTempDir(tempPath, userName, fileName);tempDir = StringUtil.stringSlashToOne(tempDir);File chunkFile = new File(tempDir + "/" + chunk);boolean result = false;// 分片文件是否存在,尺寸是否一致if (chunkFile.exists() && chunkFile.length() == Integer.parseInt(chunkSize)) {responseMsg.setSuccess(true);responseMsg.setMsg(chunk);}return responseMsg;}/*** 所有分块上传完成后合并** @param request* @param response* @param path*/@RequestMapping(value = "/merge")@ResponseBodypublic void mergeChunks(HttpServletRequest request, HttpServletResponse response, String path)throws InterruptedException {if (path == null) {return;}logger.warn("执行merge");String fileName = request.getParameter("fileName");logger.warn("mergeChunks+fileName:{}", fileName);User user = (User) request.getSession().getAttribute("user");String userName = user.getUserName();boolean b = fileService.merge(fileName, userName, path);logger.warn("mergeChunks() result:{}", b);}/*** 调用后台转码的功能** @param request* @param filepath*/@PostMapping(value = "/videoconvert")@ResponseBodypublic ResponseMsg videoconvert(HttpServletRequest request, String filepath) {ResponseMsg j = new ResponseMsg();if (filepath.isEmpty()) {j.setMsg("源文件路径名字为空!");return j;}String ffmepgpath = fileRootPath + "/ffmpeg/bin";Map<String, Object> retmap = ConvertVideo.convertVideo(filepath, ffmepgpath);String retstr = (String) retmap.get("flag");j.setMsg((String) retmap.get("path"));// 成功true并有路径,失败false也有路径,转码中false并且没路径if ("complete".equals(retstr)) {j.setSuccess(true);} else if ("transcoding".equals(retstr)) {// 这里转码中属于bug情况j.setMsg("");}return j;}/*** 获取云盘服务器所在盘磁盘空间大小** @param request*/@GetMapping(value = "/getspacesize")@ResponseBodypublic ResponseMsg getSpaceSize(HttpServletRequest request) {// 普通用户限制80G,guest用户限制40G,String userName = WebUtil.getUserNameByRequest(request);Map<String, String> spaceMap = new HashMap<>();spaceMap.put("totalSpace", "80");double totalSpace = 80;if ("guest".equals(userName)) {spaceMap.put("totalSpace", "40");totalSpace = 40;}long dirlength = SystemUtil.getDirSpaceSize(fileRootPath + userName);double dirlengthDouble = dirlength / 1024.0 / 1024 / 1024;String usedeSpace = String.format("%.2f", dirlengthDouble);logger.warn("usedeSpace:{}", usedeSpace);String freeSpace = String.format("%.2f", totalSpace - Double.valueOf(usedeSpace));logger.warn("freeSpace:{}", freeSpace);spaceMap.put("freeSpace", freeSpace);ResponseMsg responseMsg = new ResponseMsg();responseMsg.setSuccess(true);responseMsg.setMsg(JSONObject.toJSONString(spaceMap));String aString = "ddssddsd";int aaa = aString.lastIndexOf("d");return responseMsg;}}
源码获取:博客首页 "资源" 里下载!
相关文章:

快速学习的方法论
大多数人认为学习的快慢取决于学习者的天赋,实际上研究表明学习方法起着至关重要的作用。更深层次的知识加工,与时而反复的温故知新,在某些情况下会加倍你的学习效率。最近学习了如何快速学习的方法论,分享给大家。 是否能加速理解…

C#拉姆达(=)表达式
前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写…
Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术
滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成。 这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/captchaI…

FlameScope 更高级全面的火焰图
FlameScope 更高级全面的火焰图 文章目录FlameScope 更高级全面的火焰图安装步骤安装问题fix使用方式网飞(Netflix)开发的火焰图工具能够更好得呈现出一段时间内的服务器on/off cpu 的热力图。安装步骤 $ git clone https://github.com/Netflix/flamescope $ cd flamescope $ …

sql 基础--mysql 5 (6)
12.子查询 子查询进行过滤 mysql> select msg from pw_luck where name wang5-> ; ------ | msg | ------ | 1001 | | 1000 | | 1000 | | 100 | | 100 | ------ 5 rows in set (0.03 sec)mysql> select uid from pw_luck where msg in (select msg from pw_luck w…

Java项目:就业管理系统设计和实现(java+springboot+ssm)
源码获取:博客首页 "资源" 里下载! 就业管理系统: 该毕业设计采用了spring boot,spring,spring mvc,mybatis作为后端技术框架,这些组合稳定抗打,前端使用了layui,界面美观…

算法设计与分析之循环与递归
前言:循环与递归可以说是算法设计中最基本但却也是最重要的工具方法。循环和递归对于学习过高级程序设计语言的人来说都并不陌生,但还是有必要仔细的探究一下循环和递归之间的相似和区别。循环与递归最大的相似之处莫不是在于他们在算法设计中的工具作用…

面向对象与软件工程---团队作业1
1.队伍名称: 遥遥万里(还有很长路要走的意思) 2.队员信息: 陈雄(组长) 学号:1700509024 博客园链接:https://www.cnblogs.com/bearchan/ 廖鹏辉 学号:1700802007 博客园…

从paxos到raft zab,为何raft能够“独领风骚”
文章目录RAFT出现的缘由RAFT 的实现STATE MACHINELog Replicated State MachineLeader Election基本角色关键变量基本选举过程Log Replicated基本概念基本操作SafetyLog Replication: Consistency checkLeader Election: Leader Completeness总结RAFT 和 ZAB 的对比参考文献:阅…

Java项目:前台+后台精品水果商城系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统主要实现的功能有: 前台用户的登录注册,水果商品的展示,水果的购物车, 购物车新增结算等等,银行卡的支付绑定,收货…
Android屏幕像素密度适配详解
讲到像素密度,我们先要搞明白什么是像素密度,像素密度的字面上的意思为手机屏幕上一定尺寸区域内像素的个数。在Android开发中, 我们一般会使用每英寸像素密度(dpi)这样一个单位来表示手机屏幕的像素密度,d…

如让自己想学不好shell编程都困难?
众所周知,shell是linux运维必备的技术,必须要掌握,但是shell语法复杂,灵活,网友掌握了语法也不知道如何应用到实际运维中,老男孩培训shell编程给所有linux运维人员带来了学好shell的法宝,老男孩培训2014最新…

sqlserver可将字符转成数字再进行sum,如果varchar类型中存放的都是数字
sqlserver语法: select sum(cast(score as int)) as score from 表名; 注意:int是整型,在实际操作中根据自己需要的类型转换。转载于:https://www.cnblogs.com/MisMe/p/10690748.html

LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化
文章目录LSM 问题背景MatrixKV 设计细节整体架构介绍Matrix Container介绍ReceiverRowTableCompactorSpace managementColumn Compaction介绍对于Column Compaction的总结读加速 Cross-row Hint SearchMatrixKv 写入完整流程MatrixKV 读取完整流程MatrixKV 性能总结这篇论文大家…

Java项目:前台+后台在线考试系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统主要实现的功能有: 学生以及老师的注册登录,在线考试,错题查询,学生管理,问题管理,错题管理,错题查询…

修改nginx服务器类型
通常nginx服务器不隐藏服务器类型及版本信息 curl -I http://www.aaa.com 获取web服务器的类型和版本代码 HTTP/1.1 200 OK Server: nginx nginx/0.8.53 Date: Tue, 14 Dec 2010 08:10:06 GMT Content-Type: text/html Content-Length: 151 Last-Modified: Mon, 13 Dec 2…

JS 自带函数
JS数组方法汇总 array数组元素的添加和删除js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^var arr new Array();arr[0] "aaa";arr[1] "bbb";arr[2] "ccc";//alert(arr.leng…

Flink学习笔记:Operators之CoGroup及Join操作
本文为《Flink大数据项目实战》学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz 1. Window CoGroup与Join 1.1回顾RDBMS各种join 假设有两个表A和B 1.…

Rocksdb 的优秀代码(二)-- 工业级 打点系统 实现分享
文章目录前言数据结构选型打点代码设计耗时打点请求计数打点打点总结前言 一个完善的分布式系统一定是需要完善的打点统计,不论是对系统内核 还是 对系统使用者都是十分必要的。系统的客户需要直观得看到这个系统的性能相关的指标来决定是否使用以及如何最大化使用…

JVM中可生成的最大Thread数量
最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: -Xms intial java heap s…

Java项目:在线电影售票系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 前台: 1、正在上映的电影浏览查看。 2、影院信息浏览查看。 3、新闻咨询信息浏览查看。 4、地域信息查看切换。 5、用户注册登录。 6、电影排期查看。 7、在线选座生成…

matlab正态分布
normrnd(mu, sigma, m,n) 返回m x n的随机数,正态分布均值mu,标准差sigma。 mvnrnd(mu, sigma, m) 返回m个随机数(点),是多元正太分布,mu是均值向量,sigma是协方差。 x normrnd(0,4,1,100000);…

MYSQL语句
-- 一、管理数据库-- 1.1 创建数据库CREATE DATABASE day15; SHOW DATABASES; CREATE TABLE student( id INT, NAME VARCHAR(20), age INT); -- 查看表SHOW TABLES; -- 二、管理数据-- 1.1插入数据(insert into)-- 需求: 往学生表插入数据INS…

Intel Optane PMEM 概览
文章目录前言基本架构编程模型PMDK接口架构接口概览pmdk 安装开发文档汇总PMEM性能官方性能实测性能前言 随着以PCM 为存储单元的3D XPoint 非易失存储介质 不断精进的工艺,以及 上层硬件协议栈的飞速发展,为非易失内存这样硬件的出现提供了技术工艺基础…

Java项目:新闻发布系统(java+Springboot+ssm+mysql+maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 区分为管理员用户和普通用户,管理员用户能删除评论, 调整新闻显示/隐藏,修改新闻,删除普通用户,普通用户能 登陆浏…

Linux下搭建Lotus Domino集群
Linux下搭建Lotus Domino 集群本文内容是Linux平台下Lotus Domino服务器部署案例(http://chenguang.blog.51cto.com/350944/1334595)的另一个模块,所以大家首先要有以上基础之后然后继续实验。集群是 Lotus Domino Server 提供的最重要特性之…

Centos下卸载openjdk并安装自定义jdk
1、查看是否安装了openjdk java -version 2、查看需要卸载的openjdk信息,其中只需要删除红色框标记的地方 rpm -qa | grep java 3、删除openjdk rpm -e --nodeps 需要删除的java组件 4、创建文件夹java mkdir java 5、到官网下载linux版本的jdk(如果不能…

pmdk -- libpmemlog 介绍
文章目录1. libpmemlog 应用背景2. libpmemlog 使用方式2.1 基本接口2.2 接口使用3. Libpmemlog 性能3.1 write sys call 性能3.2 libpmemlog 性能1. libpmemlog 应用背景 本文介绍的是英特尔 傲腾持久化内存 pmdk中 的一个持久化日志的库。 我们正常系统中会将日志 形成一个…

Java项目:家庭财务管理系统(java+Springboot+ssm+mysql+maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 家庭财务管理系统,具有收入统计,支出统计,汇总报 表,工资录入,其他收入等录入开支信息,echart图标插 …

(原创)c++primer(第五版)--1.3 注释简介
注释可以帮助人类读者理解程序。注释通常用于概述算法,确定变量的用途,或者结束晦涩难懂的代码段。编译器会忽略注释,因此注释对程序的行为或者性能不会有任何影响。 虽然编辑器会忽略注释,但读者并不会。即使系统文档的其他部分已…