前言
來啦老鐵!
筆者學(xué)習(xí)Spring Boot有一段時(shí)間了,附上Spring Boot系列學(xué)習(xí)文章,歡迎取閱、賜教:
- 5分鐘入手Spring Boot;
- Spring Boot數(shù)據(jù)庫交互之Spring Data JPA;
- Spring Boot數(shù)據(jù)庫交互之Mybatis;
- Spring Boot視圖技術(shù);
- Spring Boot之整合Swagger;
- Spring Boot之junit單元測(cè)試踩坑;
- 如何在Spring Boot中使用TestNG;
- Spring Boot之整合logback日志;
- Spring Boot之整合Spring Batch:批處理與任務(wù)調(diào)度;
- Spring Boot之整合Spring Security: 訪問認(rèn)證;
- Spring Boot之整合Spring Security: 授權(quán)管理;
- Spring Boot之多數(shù)據(jù)庫源:極簡方案;
- Spring Boot之使用MongoDB數(shù)據(jù)庫源;
- Spring Boot之多線程、異步:@Async;
- Spring Boot之前后端分離(一):Vue前端;
- Spring Boot之前后端分離(二):后端、前后端集成;
- Spring Boot之前后端分離(三):登錄、登出、頁面認(rèn)證;
- Spring Boot之面向切面編程:Spring AOP;
- Spring Boot之集成Redis(一):Redis初入門;
- Spring Boot之集成Redis(二):集成Redis;
- Spring Boot之集成Redis(三):Spring Cache + Redis;
- Spring Boot之文件上傳、下載;
- Spring Boot中文亂碼問題解決方案:親測(cè)有效;
在之前的文章《Spring Boot之文件上傳、下載》中,我們一起學(xué)會(huì)了如何使用Spring Boot制作文件服務(wù)器,輕松實(shí)現(xiàn)了文件的傳輸(上傳、下載)。今天我打算將其擴(kuò)展一下,我們一起來實(shí)現(xiàn)一個(gè)簡易的:個(gè)人云盤!
實(shí)現(xiàn)之前,我們先找一個(gè)對(duì)標(biāo)的產(chǎn)品,比如:百度網(wǎng)盤:

百度網(wǎng)盤的整體功能還是比較簡單的,主要有幾部分:
- 文件類型分類模塊;
- 文件、文件夾列表模塊;
- 文件、文件夾操作模塊;
- 鑒權(quán)、用戶中心模塊;
- 文件搜索、展示模塊;
- 云盤容量管理模塊;
- 引流模塊;
百度網(wǎng)盤因?yàn)樯婕暗缴虡I(yè)化,所以需要一些商業(yè)化功能,而我們做的功能則不涉及到這個(gè),咱們就做個(gè)精簡版的,自己私底下用用就行了,不是咱不想做,是咱也做不到商業(yè)化??!
在我的印象中網(wǎng)盤、云盤基本都是在虧錢的,這里可以聊一下我經(jīng)歷過的一個(gè)故事:
4年前在廈門某公司的時(shí)候,當(dāng)時(shí)云盤正火,我所在的公司就做了一個(gè)云盤APP,提供給用戶免費(fèi)存放圖片、視頻,剛開始希望很美好,可是上線了之后,現(xiàn)實(shí)很骨感,我們發(fā)現(xiàn)用戶數(shù)據(jù)增長太快,文件服務(wù)器很快就撐不住了,同時(shí)也沒有辦法快速變現(xiàn)(用戶可選擇的免費(fèi)云盤產(chǎn)品太多了),印象中不到一個(gè)月,該app就下線了~
因此,我們剔除那些花里胡哨的,做點(diǎn)簡單的:
- 文件、文件夾列表模塊;
- 簡易文件、文件夾操作模塊;
- 簡易用戶鑒權(quán)模塊;
- 簡易容量管理模塊;
- 簡易文件搜索模塊;
截至目前的代碼已上傳Git Hub倉庫,歡迎取閱:
-
https://github.com/dylanz666/spring-boot-cloud-storage
前后端在同一個(gè)倉庫中分文件夾:

整體步驟
- 技術(shù)棧闡述;
- 前端設(shè)計(jì);
- 網(wǎng)站鑒權(quán)功能;
- 后端文件夾相關(guān)功能API;
- 后端文件相關(guān)功能API;
- 后端容量信息獲取功能;
- 前后端集成及演示;
1. 技術(shù)棧闡述;
- 前端:Vue.js + Element;
- 后端:Spring Boot;
- 文件服務(wù)器:個(gè)人電腦文件系統(tǒng)(若要發(fā)布到正式環(huán)境,可再修改文件系統(tǒng));
- 數(shù)據(jù)庫:暫不考慮;
- 其他:無;
2. 前端設(shè)計(jì);
(目前同時(shí)運(yùn)行前后端代碼可以登錄、查看主頁面)。


3. 網(wǎng)站鑒權(quán)功能;
整個(gè)網(wǎng)站代碼基礎(chǔ)來自于之前的實(shí)踐,網(wǎng)站鑒權(quán)更是直接拿來使用,只是我把所有人的初始密碼設(shè)置為:123。
- 當(dāng)時(shí)的文章為:Spring Boot之前后端分離(三):登錄、登出、頁面認(rèn)證;
- 當(dāng)時(shí)的前端代碼:https://github.com/dylanz666/spring-boot-vue-frontend
- 當(dāng)時(shí)的后端代碼:https://github.com/dylanz666/spring-boot-vue-backend
接下來我先在后端粗略編寫一些API,這些API還未與前端集成,到集成階段也許需要調(diào)整、增減哦~
4. 后端文件夾相關(guān)功能API;
package com.github.dylanz666.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.dylanz666.constant.APIStatus;
import com.github.dylanz666.domain.FolderInformation;
import com.github.dylanz666.domain.FolderOperationResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.io.File;
import java.util.Date;
import java.util.Objects;
/**
* @author : dylanz
* @since : 11/15/2020
*/
@RestController
@RequestMapping("/api/folder")
public class FolderOperationController {
@Value(value = "${file.root.dir}")
private String rootDir;
/**
* 創(chuàng)建文件夾
*
* @param folderName:文件夾名
*/
@PostMapping("")
public FolderOperationResponse createFolder(@RequestParam String folderName) {
FolderOperationResponse folderOperationResponse = new FolderOperationResponse();
File newFolder = new File(rootDir, folderName);
try {
if (newFolder.exists()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("The target folder name is already exist.");
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
newFolder.mkdir();
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage(APIStatus.SUCCESS.toString());
folderOperationResponse.setFolderName(folderName);
} catch (Exception e) {
e.printStackTrace();
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage(e.getMessage());
folderOperationResponse.setFolderName(folderName);
}
return folderOperationResponse;
}
/**
* 刪除文件夾
*
* @param folderName 文件夾名
* @param all 是否遞歸刪除文件夾下文件
*/
@DeleteMapping("")
public FolderOperationResponse deleteFolder(@RequestParam String folderName, @RequestParam String all) {
FolderOperationResponse folderOperationResponse = new FolderOperationResponse();
File folder = new File(rootDir, folderName);
try {
if (!folder.exists()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("文件夾不存在");
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
if (!folder.isDirectory()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("非文件夾");
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
if (all.equalsIgnoreCase("Y") || all.equalsIgnoreCase("yes") || all.equalsIgnoreCase("true")) {
deleteFolder(rootDir + "\\" + folderName);
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage(APIStatus.SUCCESS.toString());
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
if (Objects.requireNonNull(folder.listFiles()).length > 0) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("This is not a empty folder, if you still want to delete it, please pass a parameter: all, and it's value to be Y or Yes.");
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
folder.delete();
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage(APIStatus.SUCCESS.toString());
folderOperationResponse.setFolderName(folderName);
} catch (Exception e) {
e.printStackTrace();
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage(e.getMessage());
folderOperationResponse.setFolderName(folderName);
}
return folderOperationResponse;
}
/**
* 更新除文件夾名字
*
* @param folderInformation 文件夾信息
*/
@PutMapping("")
public FolderOperationResponse updateFolder(@RequestBody FolderInformation folderInformation) {
FolderOperationResponse folderOperationResponse = new FolderOperationResponse();
String currentFolderName = folderInformation.getCurrentFolderName();
String targetFolderName = folderInformation.getTargetFolderName();
File currentFolder = new File(rootDir, currentFolderName);
File targetFolder = new File(rootDir, targetFolderName);
try {
if (targetFolder.exists()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("The target folder name is already exist.");
folderOperationResponse.setFolderName(targetFolderName);
return folderOperationResponse;
}
if (currentFolder.exists()) {
currentFolder.renameTo(targetFolder);
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage(APIStatus.SUCCESS.toString());
folderOperationResponse.setFolderName(targetFolderName);
return folderOperationResponse;
}
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("The folder is not exist.");
folderOperationResponse.setFolderName(currentFolderName);
} catch (Exception e) {
e.printStackTrace();
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage(e.getMessage());
folderOperationResponse.setFolderName(currentFolderName);
}
return folderOperationResponse;
}
/**
* 驗(yàn)證文件夾是否存在
*
* @param folderName 文件夾名
*/
@GetMapping("")
public FolderOperationResponse getFolder(@RequestParam String folderName) {
FolderOperationResponse folderOperationResponse = new FolderOperationResponse();
File folder = new File(rootDir, folderName);
try {
if (!folder.exists()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("The folder is not exist.");
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
if (folder.isDirectory()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("This is not a folder.");
folderOperationResponse.setFolderName(folderName);
return folderOperationResponse;
}
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage("The folder is exist.");
folderOperationResponse.setFolderName(folderName);
} catch (Exception e) {
e.printStackTrace();
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage(e.getMessage());
folderOperationResponse.setFolderName(folderName);
}
return folderOperationResponse;
}
/**
* 獲取文件夾下的內(nèi)容
*
* @param folderName 文件夾名
* @param all 是否包含所有內(nèi)容,是則獲取包含文件夾的所有內(nèi)容,否則只獲取文件
*/
@GetMapping("/children")
public FolderOperationResponse getFiles(@RequestParam String folderName, @RequestParam String all) {
FolderOperationResponse folderOperationResponse = new FolderOperationResponse();
try {
File folder = new File(rootDir, folderName);
if (!folder.exists()) {
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage("The folder is not exist.");
folderOperationResponse.setFolderName(folderName);
folderOperationResponse.setFiles(new JSONArray());
return folderOperationResponse;
}
String[] fileList = folder.list();
JSONArray list = new JSONArray();
assert fileList != null;
for (String item : fileList) {
File sub = new File(rootDir, folderName + "\\" + item);
String subName = sub.getName().toLowerCase();
Date date = new Date(sub.lastModified());
JSONObject singleFileItem = new JSONObject();
singleFileItem.put("name", subName);
singleFileItem.put("date", String.format("%tF%n", date) + " " + String.format("%tT%n", date));
if (sub.isDirectory()) {
singleFileItem.put("path", folderName.equals("/") ? (folderName + item) : folderName + "/" + item);
singleFileItem.put("size", "-");
singleFileItem.put("type", "folder");
list.add(singleFileItem);
continue;
}
if (!(all.equalsIgnoreCase("Y") || all.equalsIgnoreCase("yes") || all.equalsIgnoreCase("true"))) {
continue;
}
singleFileItem.put("path", folderName);
singleFileItem.put("size", sub.length() / 1000 + " kb");
if (subName.endsWith(".jpg") || subName.endsWith(".jpeg") || subName.endsWith(".png") || subName.endsWith(".bmp") || subName.endsWith(".ico") || subName.endsWith(".psd") || subName.endsWith(".psb") || subName.endsWith(".gif")) {
singleFileItem.put("type", "image");
list.add(singleFileItem);
continue;
}
if (subName.endsWith(".mp4") || subName.endsWith(".mov") || subName.endsWith(".3gp") || subName.endsWith(".avi") || subName.endsWith(".mpg") || subName.endsWith(".mpeg") || subName.endsWith(".flv") || subName.endsWith(".mkv") || subName.endsWith(".rm") || subName.endsWith(".rmvb") || subName.endsWith(".wmv")) {
singleFileItem.put("type", "video");
list.add(singleFileItem);
continue;
}
if (subName.endsWith(".mp3") || subName.endsWith(".wav") || subName.endsWith(".ogg") || subName.endsWith(".ape") || subName.endsWith(".acc")) {
singleFileItem.put("type", "audio");
list.add(singleFileItem);
continue;
}
singleFileItem.put("type", "file");
list.add(singleFileItem);
}
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage(APIStatus.SUCCESS.toString());
folderOperationResponse.setFolderName(folderName);
folderOperationResponse.setFiles(list);
} catch (Exception e) {
e.printStackTrace();
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage(e.getMessage());
folderOperationResponse.setFolderName(folderName);
folderOperationResponse.setFiles(new JSONArray());
}
return folderOperationResponse;
}
private void deleteFolder(String path) {
File folder = new File(path);
if (!folder.isFile()) {
File[] files = folder.listFiles();
if (files != null) {
for (File f : files) {
deleteFolder(f.getAbsolutePath());
}
}
}
folder.delete();
}
}
5. 后端文件相關(guān)功能API;
package com.github.dylanz666.controller;
import com.alibaba.fastjson.JSONArray;
import com.github.dylanz666.constant.APIStatus;
import com.github.dylanz666.domain.FileDetail;
import com.github.dylanz666.domain.FileInformation;
import com.github.dylanz666.domain.FileOperationResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Objects;
/**
* @author : dylanz
* @since : 11/02/2020
*/
@RestController
@RequestMapping("/api/file")
public class FileOperationController {
@Value(value = "${file.root.dir}")
private String rootDir;
private FileInputStream fis = null;
private BufferedInputStream bis = null;
/**
* 向系統(tǒng)增加文件(上傳)
*
* @param folderName 上傳目標(biāo)子文件夾
* @param file 上傳的文件
*/
@PostMapping("")
public FileOperationResponse upload(@RequestParam String folderName, @RequestParam("file") MultipartFile file) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
String fileName = file.getOriginalFilename();
assert fileName != null;
try {
File dest = new File(rootDir, folderName + "\\" + fileName);
//當(dāng)文件父文件夾不存在,則創(chuàng)建該文件夾
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdir();
}
file.transferTo(dest);
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage(APIStatus.SUCCESS.toString());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
} catch (Exception e) {
e.printStackTrace();
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage(e.getMessage());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
}
return fileOperationMessage;
}
/**
* 批量向系統(tǒng)增加文件(上傳)
*
* @param folderName 上傳目標(biāo)子文件夾
* @param files 上傳的文件們,調(diào)用API時(shí),form-data中可傳多個(gè)file名字的文件
*/
@PostMapping("/batch")
public FileOperationResponse uploadFiles(@RequestParam String folderName, @RequestParam("file") List<MultipartFile> files) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
StringBuilder responseFileName = new StringBuilder();
for (MultipartFile file : files) {
String fileName = file.getOriginalFilename();
assert fileName != null;
responseFileName.append(fileName).append(";");
try {
File dest = new File(rootDir, folderName + "\\" + fileName);
//當(dāng)文件父文件夾不存在,則創(chuàng)建該文件夾
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdir();
}
file.transferTo(dest);
} catch (Exception e) {
e.printStackTrace();
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage(e.getMessage());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(responseFileName.toString());
}
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage(APIStatus.SUCCESS.toString());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(responseFileName.toString());
}
return fileOperationMessage;
}
/**
* 刪除系統(tǒng)中的文件
*
* @param folderName 要?jiǎng)h除的文件的目標(biāo)文件夾
* @param fileName 要?jiǎng)h除的文件
*/
@DeleteMapping("")
public FileOperationResponse delete(@RequestParam String folderName, @RequestParam String fileName) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
File file = new File(rootDir, folderName + "\\" + fileName);
try {
if (file.exists()) {
file.delete();
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage(APIStatus.SUCCESS.toString());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
return fileOperationMessage;
}
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("The file is not exist.");
fileOperationMessage.setFileName(fileName);
} catch (Exception e) {
e.printStackTrace();
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage(e.getMessage());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
}
return fileOperationMessage;
}
/**
* 批量刪除系統(tǒng)中的文件
*
* @param files 要?jiǎng)h除的文件
*/
@PostMapping("/batchDelete")
public FileOperationResponse deleteFiles(@RequestBody FileDetail[] files) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
if (files.length == 0) {
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("請(qǐng)選擇要?jiǎng)h除的文件");
return fileOperationMessage;
}
int successQuantity = 0;
int failQuantity = 0;
FileDetail file1 = files[0];
String folderName = file1.getPath();
for (int i = 0; i < files.length; i++) {
FileDetail fileDetail = files[i];
String fileName = fileDetail.getName();
File file = new File(rootDir, folderName + "\\" + fileName);
try {
if (file.exists()) {
file.delete();
successQuantity += 1;
continue;
}
failQuantity += 1;
} catch (Exception e) {
e.printStackTrace();
failQuantity += 1;
}
}
if (failQuantity == 0 && successQuantity > 0) {
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage(APIStatus.SUCCESS.toString());
fileOperationMessage.setFolderName(folderName);
}
if (failQuantity > 0) {
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("刪除成功:" + successQuantity + ",刪除失?。? + failQuantity);
fileOperationMessage.setFolderName(folderName);
}
return fileOperationMessage;
}
/**
* 修改系統(tǒng)中的文件名
*
* @param fileInformation 文件信息
*/
@PutMapping("")
public FileOperationResponse updateFile(@RequestBody FileInformation fileInformation) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
String folder = rootDir + "\\" + fileInformation.getFolderName();
String currentFileName = fileInformation.getCurrentFileName();
String targetFileName = fileInformation.getTargetFileName();
File currentFile = new File(folder, currentFileName);
File targetFile = new File(folder, targetFileName);
try {
if (targetFile.exists()) {
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("The target file name is already exist.");
fileOperationMessage.setFileName(targetFileName);
return fileOperationMessage;
}
if (currentFile.exists()) {
currentFile.renameTo(targetFile);
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage(APIStatus.SUCCESS.toString());
fileOperationMessage.setFileName(targetFileName);
return fileOperationMessage;
}
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("The file is not exist.");
fileOperationMessage.setFileName(currentFileName);
} catch (Exception e) {
e.printStackTrace();
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage(e.getMessage());
fileOperationMessage.setFileName(currentFileName);
}
return fileOperationMessage;
}
/**
* 下載系統(tǒng)中的文件
*
* @param folderName 被下載的目標(biāo)子文件夾
* @param fileName 被下載的文件
*/
@GetMapping("/download")
public FileOperationResponse download(@RequestParam String folderName, @RequestParam String fileName) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
String folder = rootDir + "\\" + folderName;
try {
File file = new File(folder, fileName);
HttpServletResponse response = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse();
assert response != null;
response.setContentType("application/force-download");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
if (file.exists()) {
byte[] buffer = new byte[1024];
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage(APIStatus.SUCCESS.toString());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
return fileOperationMessage;
}
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("The file is not exist.");
fileOperationMessage.setFileName(fileName);
} catch (Exception e) {
e.printStackTrace();
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage(e.getMessage());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
} finally {
try {
bis.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return fileOperationMessage;
}
/**
* 驗(yàn)證文件是否存在
*
* @param folderName 文件的文件夾名
* @param fileName 文件名
*/
@GetMapping("")
public FileOperationResponse getFile(@RequestParam String folderName, @RequestParam String fileName) {
FileOperationResponse fileOperationMessage = new FileOperationResponse();
String folder = rootDir + "\\" + folderName;
try {
File file = new File(folder, fileName);
if (!file.exists()) {
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage("The file is not exist.");
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
return fileOperationMessage;
}
fileOperationMessage.setStatus(APIStatus.SUCCESS.toString());
fileOperationMessage.setMessage("The file is exist.");
fileOperationMessage.setFileName(fileName);
} catch (Exception e) {
e.printStackTrace();
fileOperationMessage.setStatus(APIStatus.FAIL.toString());
fileOperationMessage.setMessage(e.getMessage());
fileOperationMessage.setFolderName(folderName);
fileOperationMessage.setFileName(fileName);
}
return fileOperationMessage;
}
}
6. 后端容量信息獲取功能;
package com.github.dylanz666.controller;
import com.github.dylanz666.constant.APIStatus;
import com.github.dylanz666.domain.FolderOperationResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
/**
* @author : dylanz
* @since : 11/22/2020
*/
@RestController
@RequestMapping("/api/space")
public class SpaceController {
@Value(value = "${file.root.dir}")
private String rootDir;
/**
* 獲取文件系統(tǒng)容量信息
*/
@GetMapping("")
public FolderOperationResponse getSpaceInfo() {
File folder = new File(rootDir);
FolderOperationResponse folderOperationResponse = new FolderOperationResponse();
try {
long free = folder.getFreeSpace();
long total = folder.getTotalSpace();
String freeString = (free / 1024 / 1024 / 1024) + "G";
String totalString = (total / 1024 / 1024 / 1024) + "G";
String message = freeString + "/" + totalString;
folderOperationResponse.setStatus(APIStatus.SUCCESS.toString());
folderOperationResponse.setMessage(message);
return folderOperationResponse;
} catch (Exception e) {
e.printStackTrace();
folderOperationResponse.setStatus(APIStatus.FAIL.toString());
folderOperationResponse.setMessage(e.getMessage());
}
return folderOperationResponse;
}
}
7. 前后端集成及演示;
這一步我們留到下次再來完成吧,今天就到這啦!
今天的文章雖然沒有完整的完成一個(gè)個(gè)人云盤應(yīng)用,但您從文章中仍可以學(xué)到一些東西的,如:
1). Java中/Spring Boot中常用的文件夾操作代碼;
2). Java中/Spring Boot中常用的文件操作代碼;
3). 個(gè)人云盤應(yīng)用的設(shè)計(jì)、實(shí)現(xiàn)思路;
4). Spring Boot基礎(chǔ)對(duì)于實(shí)現(xiàn)具體應(yīng)用的重要性;
等。
下個(gè)禮拜,我們不見不散!
如果本文對(duì)您有幫助,麻煩點(diǎn)贊、關(guān)注!
謝謝!