Java專案:線上嘿嘿網盤系統設計和實現(java+Springboot+ssm+mysql+maven)

leida777發表於2022-03-09

一、專案簡述

功能:使用者的郵箱註冊、驗證碼驗證以及使用者登入。 不需要註冊賬號,也可以上傳滿足條件的臨時檔案,但是 只4小時內有效。 檔案的管理,上傳、下載、重新命名、刪除、檢視統計數 據、分類管理等。 資料夾的管理,建立、刪除、重新命名。 檔案的分享,支援透過鏈博口二維碼的分享方式等等。


二、專案執行

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


專案技術: JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等












管理員控制器:

 

 

/**

 * @ClassName: AdminController

 * @Description: 管理員控制器

 **/

@Controller

public class AdminController extends BaseController {

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

    

    /**

     * @Description 前往使用者管理頁面

     * @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<Object> page = PageHelper.startPage(cur, 20);

        List<UserToShow> 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 修改使用者的許可權和最大容量

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

        }

    }

 

    /**

     * @Description 刪除使用者

     * @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<FileFolder> folders = fileFolderService.getRootFoldersByFileStoreId(fileStore.getFileStoreId());

        //迭代刪除資料夾

        for (FileFolder f:folders) {

            deleteFolderF(f);

        }

        List<MyFile> 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 迭代刪除資料夾裡面的所有檔案和子資料夾

     * @Author xw

     * @Date 9:17 2020/2/29

     * @Param [folder]

     * @return void

     **/

    public void deleteFolderF(FileFolder folder){

        //獲得當前資料夾下的所有子資料夾

        List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());

        //刪除當前資料夾的所有的檔案

        List<MyFile> 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 登入控制器

 * @return

 **/

@Controller

public 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";

    }

 

    /**

     * 用於註冊流程,使用者名稱,密碼,郵箱等校驗工作由前端來完成

     *

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

     * @Description 向註冊郵箱傳送驗證碼, 並驗證郵箱是否已使用

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

    }

 

    /**

     * @Description 請求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();

        }

    }

 

    /**

     * @Description 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 "登入失敗!請檢視日誌資訊...";

    }

 

    /**

     * @Description 處理掉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;

    }

 

    /**

     * @Description 退出登入,清空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

 * @Description: 檔案倉庫控制器

 **/

@Controller

public class FileStoreController extends BaseController {

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

 

    /**

     * @Description 上傳臨時檔案

     * @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",");

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

    }

 

    /**

     * @Description 網盤的檔案上傳

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

    }

 

    /**

     * @Description 網盤的檔案下載 

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

    }

 

    /**

     * @Description 刪除檔案

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

    }

    

    /**

     * @Description 刪除資料夾並清空檔案

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

    } 

 

    /**

     * @Description 迭代刪除資料夾裡面的所有檔案和子資料夾

     * @Author xw

     * @Date 9:17 2020/2/29

     * @Param [folder]

     * @return void

     **/

    public void deleteFolderF(FileFolder folder){

        //獲得當前資料夾下的所有子資料夾

        List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());

        //刪除當前資料夾的所有的檔案

        List<MyFile> 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 新增資料夾

     * @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<FileFolder> 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 重新命名資料夾

     * @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<FileFolder> 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 重新命名檔案

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

    }

 

    /**

     * @Description 獲得二維碼 

     * @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",");

        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 分享檔案

     * @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(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 根據檔案的字尾名獲得對應的型別

     * @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)||".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 正則驗證檔名是否合法 [漢字,字元,數字,下劃線,英文句號,橫線]

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

    }

 

    /**

     * @Description 判斷當前瀏覽器是否為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;

    }

 

}



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70014825/viewspace-2868643/,如需轉載,請註明出處,否則將追究法律責任。

相關文章