Java專案:線上嘿嘿網盤系統設計和實現(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
* @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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於Java+Springboot+Jpa+Mysql實現的線上網盤檔案分享系統功能設計與實現一JavaSpring BootMySql
- 基於Java+Springboot+Jpa+Mysql實現的線上網盤檔案分享系統功能設計與實現二JavaSpring BootMySql
- 基於Java+Springboot+Jpa+Mysql實現的線上網盤檔案分享系統功能設計與實現四JavaSpring BootMySql
- 基於Java+Springboot+Jpa+Mysql實現的線上網盤檔案分享系統功能設計與實現六JavaSpring BootMySql
- 【解決方案】Java 網際網路專案中訊息通知系統的設計與實現(上)Java
- 線上消費行為統計與分析系統設計和實現
- Java畢業設計_基於MySQL網盤管理系統的設計與實現JavaMySql
- 【解決方案】Java 網際網路專案中訊息通知系統的設計與實現(下)Java
- java 網路考試 線上教育系統 模組設計方案Java
- java PC 和 手機 線上考試系統 模組設計方案Java
- 線上電影系統設計
- 基於java的網路招聘系統的設計與實現Java
- 駕校管理系統設計和實現
- 【專案記錄】個人主頁設計和實現
- java版工程專案管理系統原始碼+系統管理+系統設定+專案管理Java專案管理原始碼
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現五JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現六JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現三JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現四JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現一JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現二JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上課程學習教育系統功能設計與實現七JavaSpring BootMySql
- 資料庫連線池設計和實現(Java版本)資料庫Java
- 鴻蒙系統學習路線和專案實戰分享!鴻蒙
- Java進階專題(十七) 系統快取架構設計 (上)Java快取架構
- Python網路程式設計實現TCP和UDP連線Python程式設計TCPUDP
- 畢設專案:springboot+vue實現的線上求職平臺Spring BootVue求職
- 重學 Java 設計模式:實戰備忘錄模式「模擬網際網路系統上線過程中,配置檔案回滾場景」Java設計模式
- ssh+mysql實現的Java web線上訂電影票系統專案原始碼附帶視訊指導教程MySqlJavaWeb原始碼
- 使用java的MultipartFile實現layui官網檔案上傳實現全部示例,java檔案上傳JavaUI
- 基於Java+Jsp+SpringMVC漫威手辦商城系統設計和實現JavaJSSpringMVC
- 城市排水管網系統如何實現線上監測和自動預警
- 管理系統之許可權的設計和實現
- 畢業設計&畢業專案:基於springboot+vue實現的線上音樂平臺Spring BootVue
- phantomjs實現免費線上網頁截圖工具-toolfk程式設計師線上工具網JS網頁程式設計師
- 鏈遊專案系統開發方案設計
- 在Cloudreve網盤系統中整合kkFileView線上預覽(暫時)CloudView
- 和付費網盤說再見,跟著本文自己起個網盤(Java 開源專案)Java