Spring Boot之框架應(yīng)用:個(gè)人云盤(一)

前言

來啦老鐵!

筆者學(xué)習(xí)Spring Boot有一段時(shí)間了,附上Spring Boot系列學(xué)習(xí)文章,歡迎取閱、賜教:

  1. 5分鐘入手Spring Boot;
  2. Spring Boot數(shù)據(jù)庫交互之Spring Data JPA;
  3. Spring Boot數(shù)據(jù)庫交互之Mybatis;
  4. Spring Boot視圖技術(shù);
  5. Spring Boot之整合Swagger;
  6. Spring Boot之junit單元測(cè)試踩坑;
  7. 如何在Spring Boot中使用TestNG;
  8. Spring Boot之整合logback日志;
  9. Spring Boot之整合Spring Batch:批處理與任務(wù)調(diào)度;
  10. Spring Boot之整合Spring Security: 訪問認(rèn)證;
  11. Spring Boot之整合Spring Security: 授權(quán)管理;
  12. Spring Boot之多數(shù)據(jù)庫源:極簡方案;
  13. Spring Boot之使用MongoDB數(shù)據(jù)庫源;
  14. Spring Boot之多線程、異步:@Async;
  15. Spring Boot之前后端分離(一):Vue前端;
  16. Spring Boot之前后端分離(二):后端、前后端集成;
  17. Spring Boot之前后端分離(三):登錄、登出、頁面認(rèn)證;
  18. Spring Boot之面向切面編程:Spring AOP;
  19. Spring Boot之集成Redis(一):Redis初入門;
  20. Spring Boot之集成Redis(二):集成Redis;
  21. Spring Boot之集成Redis(三):Spring Cache + Redis;
  22. Spring Boot之文件上傳、下載;
  23. 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)盤

百度網(wǎng)盤的整體功能還是比較簡單的,主要有幾部分:

  1. 文件類型分類模塊;
  2. 文件、文件夾列表模塊;
  3. 文件、文件夾操作模塊;
  4. 鑒權(quán)、用戶中心模塊;
  5. 文件搜索、展示模塊;
  6. 云盤容量管理模塊;
  7. 引流模塊;

百度網(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)簡單的:

  1. 文件、文件夾列表模塊;
  2. 簡易文件、文件夾操作模塊;
  3. 簡易用戶鑒權(quán)模塊;
  4. 簡易容量管理模塊;
  5. 簡易文件搜索模塊;

截至目前的代碼已上傳Git Hub倉庫,歡迎取閱:

前后端代碼隔離

整體步驟

  1. 技術(shù)棧闡述;
  2. 前端設(shè)計(jì);
  3. 網(wǎng)站鑒權(quán)功能;
  4. 后端文件夾相關(guān)功能API;
  5. 后端文件相關(guān)功能API;
  6. 后端容量信息獲取功能;
  7. 前后端集成及演示;

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。

接下來我先在后端粗略編寫一些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)注!

謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容