一、项目简述
功能:用户的邮箱注册、验证码验证以及用户登录。
不需要注册账号,也可以上传满足条件的临时文件,但是只4小时内有效。
文件的管理,上传、下载、重命名、删除、查看统计数据、分类管理等。
文件夹的管理,创建、删除、重命名。
文件的分享,支持通过链接和二维码的分享方式等等,以及管理员对用户的管理等等。
二、项目运行
环境配置:
Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)
项目技术:
JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
} 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)||".png".equals(type)||".webp".equals(type)
||".svg".equals(type)){
return 2;
} else if (".avi".equals(type)||".mov".equals(type)||".qt".equals(type)
||".asf".equals(type)||".rm".equals(type)||".navi".equals(type)||".wav".equals(type)
||".mp4".equals(type)||".mkv".equals(type)||".webm".equals(type)){
return 3;
* @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++) {
* @return java.lang.String
**/
@GetMapping("/help")
public String helpPage(Map<String, Object> map) {
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
return "u-admin/help";
}
}
文件仓库控制器:
/**
* @ClassName: FileStoreController
* @Description: 文件仓库控制器
**/
@Controller
public class FileStoreController extends BaseController {
private Logger logger = LogUtils.getInstance(FileStoreController.class);
/**
* @Description 上传临时文件
//删除当前文件夹的所有的文件
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));
}
}
* @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());
//删除当前文件夹的所有的文件
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("文件下载成功!");
}
**/
@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","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg");
String name = file.getOriginalFilename().replaceAll(" ","");
if (!checkTarget(name)){
logger.error("临时文件上传失败!文件名不符合规范...");
session.setAttribute("msg", "上传失败!文件名不符合规范");
return "redirect:/temp-file";
}
//当前文件夹的相对路径
List<FileFolder> location = new ArrayList<>();
if (fId == null || fId <= 0) {
//代表当前为根目录
fId = 0;
folders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());
files = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId());
nowFolder = FileFolder.builder().fileFolderId(fId).build();
location.add(nowFolder);
} else {
//当前为具体目录,访问的文件夹不是当前登录用户所创建的文件夹
FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId);
if (folder.getFileStoreId() - loginUser.getFileStoreId() != 0){
return "redirect:/error401Page";
}
//当前为具体目录,访问的文件夹是当前登录用户所创建的文件夹
folders = fileFolderService.getFileFolderByParentFolderId(fId);
files = myFileService.getFilesByParentFolderId(fId);
nowFolder = fileFolderService.getFileFolderByFileFolderId(fId);
//遍历查询当前目录
FileFolder temp = nowFolder;
while (temp.getParentFolderId() != 0) {
temp = fileFolderService.getFileFolderByFileFolderId(temp.getParentFolderId());
location.add(temp);
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";
}
}
/**
* @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)||".png".equals(type)||".webp".equals(type)
||".svg".equals(type)){
return 2;
} else if (".avi".equals(type)||".mov".equals(type)||".qt".equals(type)
||".asf".equals(type)||".rm".equals(type)||".navi".equals(type)||".wav".equals(type)
||".mp4".equals(type)||".mkv".equals(type)||".webm".equals(type)){
return 3;
} else if (".mp3".equals(type)||".wma".equals(type)){
return 4;
} else {
return 5;
}
}