From 2b75762b764310120f9825abd6f2e57b54e2202d Mon Sep 17 00:00:00 2001 From: ruibaby Date: Wed, 18 Dec 2019 17:41:15 +0800 Subject: [PATCH] feat: completed static storage api. --- .../admin/api/StaticStorageController.java | 33 +++++++-- .../app/service/StaticStorageService.java | 25 +++++++ .../impl/StaticStorageServiceImpl.java | 68 ++++++++++++++++++- 3 files changed, 120 insertions(+), 6 deletions(-) diff --git a/src/main/java/run/halo/app/controller/admin/api/StaticStorageController.java b/src/main/java/run/halo/app/controller/admin/api/StaticStorageController.java index 58b016c0a..79ed4ac11 100644 --- a/src/main/java/run/halo/app/controller/admin/api/StaticStorageController.java +++ b/src/main/java/run/halo/app/controller/admin/api/StaticStorageController.java @@ -1,16 +1,18 @@ package run.halo.app.controller.admin.api; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import run.halo.app.model.support.StaticFile; import run.halo.app.service.StaticStorageService; import java.util.List; /** - * @author ryan0up - * @date 2019/12/6 + * Static storage controller. + * + * @author ryanwang + * @date 2019-12-06 */ @RestController @RequestMapping("/api/admin/statics") @@ -23,7 +25,28 @@ public class StaticStorageController { } @GetMapping + @ApiOperation("List static files.") public List list() { return staticStorageService.listStaticFolder(); } + + @DeleteMapping + @ApiOperation("Delete file by relative path") + public void deletePermanently(@RequestParam("path") String path) { + staticStorageService.delete(path); + } + + @PostMapping + @ApiOperation("Create folder") + public void createFolder(String basePath, + @RequestParam("folderName") String folderName) { + staticStorageService.createFolder(basePath, folderName); + } + + @PostMapping("upload") + @ApiOperation("Upload static file") + public void upload(String basePath, + @RequestPart("file") MultipartFile file) { + staticStorageService.update(basePath, file); + } } diff --git a/src/main/java/run/halo/app/service/StaticStorageService.java b/src/main/java/run/halo/app/service/StaticStorageService.java index 1b975a7cf..f73f24e0f 100644 --- a/src/main/java/run/halo/app/service/StaticStorageService.java +++ b/src/main/java/run/halo/app/service/StaticStorageService.java @@ -1,5 +1,7 @@ package run.halo.app.service; +import org.springframework.lang.NonNull; +import org.springframework.web.multipart.MultipartFile; import run.halo.app.model.support.StaticFile; import java.util.List; @@ -23,4 +25,27 @@ public interface StaticStorageService { * @return List */ List listStaticFolder(); + + /** + * Delete file or folder by relative path + * + * @param relativePath relative path + */ + void delete(@NonNull String relativePath); + + /** + * Create folder. + * + * @param basePath base path + * @param folderName folder name must not be null + */ + void createFolder(String basePath, @NonNull String folderName); + + /** + * Update static file. + * + * @param basePath base path + * @param file file must not be null. + */ + void update(String basePath, @NonNull MultipartFile file); } diff --git a/src/main/java/run/halo/app/service/impl/StaticStorageServiceImpl.java b/src/main/java/run/halo/app/service/impl/StaticStorageServiceImpl.java index 1be4bd607..8574d475d 100644 --- a/src/main/java/run/halo/app/service/impl/StaticStorageServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/StaticStorageServiceImpl.java @@ -5,10 +5,13 @@ import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.util.Assert; +import org.springframework.web.multipart.MultipartFile; import run.halo.app.config.properties.HaloProperties; +import run.halo.app.exception.FileOperationException; import run.halo.app.exception.ServiceException; import run.halo.app.model.support.StaticFile; import run.halo.app.service.StaticStorageService; +import run.halo.app.utils.FileUtils; import java.io.IOException; import java.nio.file.Files; @@ -38,7 +41,6 @@ public class StaticStorageServiceImpl implements StaticStorageService { @Override public List listStaticFolder() { - System.out.println(staticDir); return listStaticFileTree(staticDir); } @@ -78,4 +80,68 @@ public class StaticStorageServiceImpl implements StaticStorageService { } } + @Override + public void delete(String relativePath) { + Assert.notNull(relativePath, "Relative path must not be null"); + + Path path = Paths.get(staticDir.toString(), relativePath); + System.out.println(path.toString()); + + try { + if (path.toFile().isDirectory()) { + FileUtils.deleteFolder(path); + } else { + Files.deleteIfExists(path); + } + } catch (IOException e) { + throw new FileOperationException("文件 " + relativePath + " 删除失败", e); + } + } + + @Override + public void createFolder(String basePath, String folderName) { + Assert.notNull(folderName, "Folder name path must not be null"); + + Path path; + + if (StringUtils.isEmpty(basePath)) { + path = Paths.get(staticDir.toString(), folderName); + } else { + path = Paths.get(staticDir.toString(), basePath, folderName); + } + + if (path.toFile().exists()) { + throw new FileOperationException("目录 " + path.toString() + " 已存在").setErrorData(path); + } + + try { + FileUtils.createIfAbsent(path); + } catch (IOException e) { + throw new FileOperationException("目录 " + path.toString() + " 创建失败", e); + } + } + + @Override + public void update(String basePath, MultipartFile file) { + Assert.notNull(file, "Multipart file must not be null"); + + Path uploadPath; + + if (StringUtils.isEmpty(basePath)) { + uploadPath = Paths.get(staticDir.toString(), file.getOriginalFilename()); + } else { + uploadPath = Paths.get(staticDir.toString(), basePath, file.getOriginalFilename()); + } + + if (uploadPath.toFile().exists()) { + throw new FileOperationException("文件 " + file.getOriginalFilename() + " 已存在").setErrorData(uploadPath); + } + + try { + Files.createFile(uploadPath); + file.transferTo(uploadPath); + } catch (IOException e) { + throw new ServiceException("上传文件失败").setErrorData(uploadPath); + } + } }