批量删除文件和批量删除直链功能

This commit is contained in:
zhaojun
2022-08-26 18:18:19 +08:00
parent 477c9dbdd2
commit 7399c89a8e
7 changed files with 134 additions and 89 deletions

View File

@@ -1,10 +1,11 @@
package im.zhaojun.zfile.home.controller;
import cn.hutool.core.collection.CollUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import im.zhaojun.zfile.common.context.StorageSourceContext;
import im.zhaojun.zfile.home.model.request.operator.DeleteFileRequest;
import im.zhaojun.zfile.home.model.request.operator.DeleteFolderRequest;
import im.zhaojun.zfile.home.model.enums.FileTypeEnum;
import im.zhaojun.zfile.home.model.request.operator.BatchDeleteRequest;
import im.zhaojun.zfile.home.model.request.operator.NewFolderRequest;
import im.zhaojun.zfile.home.model.request.operator.RenameFileRequest;
import im.zhaojun.zfile.home.model.request.operator.RenameFolderRequest;
@@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
* 文件操作相关接口, 如新建文件夹, 上传文件, 删除文件, 移动文件等.
@@ -52,29 +54,33 @@ public class FileOperatorController {
@ApiOperationSupport(order = 2)
@ApiOperation(value = "删除文件")
@PostMapping("/delete/file")
public AjaxJson<?> deleteFile(@Valid @RequestBody DeleteFileRequest deleteFileRequest) {
AbstractBaseFileService<?> fileService = storageSourceContext.getByKey(deleteFileRequest.getStorageKey());
boolean flag = fileService.deleteFile(deleteFileRequest.getPath(), deleteFileRequest.getName());
if (flag) {
return AjaxJson.getSuccess("删除成功");
} else {
return AjaxJson.getError("删除失败");
@ApiOperation(value = "批量删除文件/文件夹")
@PostMapping("/delete/batch")
public AjaxJson<?> deleteFile(@Valid @RequestBody BatchDeleteRequest batchDeleteRequest) {
AbstractBaseFileService<?> fileService = storageSourceContext.getByKey(batchDeleteRequest.getStorageKey());
List<BatchDeleteRequest.DeleteItem> deleteItems = batchDeleteRequest.getDeleteItems();
int deleteSuccessCount = 0, deleteFailCount = 0, totalCount = CollUtil.size(deleteItems);
for (BatchDeleteRequest.DeleteItem deleteItem : deleteItems) {
boolean flag = false;
if (deleteItem.getType() == FileTypeEnum.FILE) {
flag = fileService.deleteFile(deleteItem.getPath(), deleteItem.getName());
} else if (deleteItem.getType() == FileTypeEnum.FOLDER) {
flag = fileService.deleteFile(deleteItem.getPath(), deleteItem.getName());
}
if (flag) {
deleteSuccessCount++;
} else {
deleteFailCount++;
}
}
}
@ApiOperationSupport(order = 3)
@ApiOperation(value = "删除文件夹")
@PostMapping("/delete/folder")
public AjaxJson<?> deleteFolder(@Valid @RequestBody DeleteFolderRequest deleteFolderRequest) {
AbstractBaseFileService<?> fileService = storageSourceContext.getByKey(deleteFolderRequest.getStorageKey());
boolean flag = fileService.deleteFolder(deleteFolderRequest.getPath(), deleteFolderRequest.getName());
if (flag) {
return AjaxJson.getSuccess("删除成功");
if (totalCount > 1) {
return AjaxJson.getSuccess("批量删除 " + totalCount + " 个, 删除成功 " + deleteSuccessCount + " 个, 失败 " + deleteFailCount + " 个.");
} else {
return AjaxJson.getError("删除失败");
return totalCount == deleteSuccessCount ? AjaxJson.getSuccess("删除成功") : AjaxJson.getError("删除失败");
}
}

View File

@@ -14,19 +14,27 @@ import im.zhaojun.zfile.common.exception.IllegalDownloadLinkException;
import im.zhaojun.zfile.common.util.AjaxJson;
import im.zhaojun.zfile.common.util.StringUtils;
import im.zhaojun.zfile.home.model.dto.SystemConfigDTO;
import im.zhaojun.zfile.home.model.request.BatchGenerateLinkRequest;
import im.zhaojun.zfile.home.model.result.BatchGenerateLinkResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 短链接口
@@ -36,6 +44,7 @@ import java.io.IOException;
@Api(tags = "直短链模块")
@ApiSort(5)
@Controller
@Slf4j
public class ShortLinkController {
@Resource
@@ -47,8 +56,7 @@ public class ShortLinkController {
@Resource
private StorageSourceService storageSourceService;
@GetMapping("/api/short-link")
@PostMapping("/api/short-link/batch/generate")
@ResponseBody
@ApiOperationSupport(order = 1)
@ApiOperation(value = "生成短链", notes = "对指定存储源的某文件路径生成短链")
@@ -61,7 +69,9 @@ public class ShortLinkController {
@DynamicParameter(name = "code", value = "业务状态码0 为正常,其他值均为异常,异常情况下见响应消息", example = "0"),
@DynamicParameter(name = "data", value = "短链地址", example = "https://zfile.vip/s/btz4tu")
})
public AjaxJson<String> generatorShortLink(String storageKey, String path) {
public AjaxJson<List<BatchGenerateLinkResponse>> generatorShortLink(@RequestBody @Valid BatchGenerateLinkRequest batchGenerateLinkRequest) {
List<BatchGenerateLinkResponse> result = new ArrayList<>();
// 获取站点域名
SystemConfigDTO systemConfig = systemConfigService.getSystemConfig();
@@ -73,9 +83,12 @@ public class ShortLinkController {
}
String domain = systemConfig.getDomain();
// 拼接直链地址.
String storageKey = batchGenerateLinkRequest.getStorageKey();
for (String path : batchGenerateLinkRequest.getPaths()) {
// 拼接全路径地址.
String fullPath = StringUtils.concat(path);
// 生成短链
ShortLink shortLink = shortLinkService.findByStorageKeyAndUrl(storageKey, fullPath);
// 如果没有短链,则生成短链
if (shortLink == null) {
@@ -84,7 +97,11 @@ public class ShortLinkController {
}
String shortUrl = StringUtils.removeDuplicateSlashes(domain + "/s/" + shortLink.getShortKey());
return AjaxJson.getSuccessData(shortUrl);
String pathLink = StringUtils.generatorPathLink(storageKey, fullPath);
result.add(new BatchGenerateLinkResponse(shortUrl, pathLink));
}
return AjaxJson.getSuccessData(result);
}

View File

@@ -0,0 +1,24 @@
package im.zhaojun.zfile.home.model.request;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* 批量生成直链请求类
* @author zhaojun
*/
@Data
@ApiModel(description = "批量生成直链请求类")
public class BatchGenerateLinkRequest {
@NotBlank(message = "存储源 key 不能为空")
private String storageKey;
@NotEmpty(message = "生成的文件路径不能为空")
private List<String> paths;
}

View File

@@ -0,0 +1,39 @@
package im.zhaojun.zfile.home.model.request.operator;
import im.zhaojun.zfile.home.model.enums.FileTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* 删除文件夹请求参数
*
* @author zhaojun
*/
@Data
@ApiModel(description = "删除文件夹请求类")
public class BatchDeleteRequest {
@ApiModelProperty(value = "存储源 key", required = true, example = "local")
@NotBlank(message = "存储源 key 不能为空")
private String storageKey;
@ApiModelProperty(value = "删除的文件详情")
@NotEmpty(message = "要删除的文件/文件夹不能为空")
private List<DeleteItem> deleteItems;
@Data
public static class DeleteItem {
private String name;
private String path;
private FileTypeEnum type;
}
}

View File

@@ -1,30 +0,0 @@
package im.zhaojun.zfile.home.model.request.operator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 删除文件请求参数
*
* @author zhaojun
*/
@Data
@ApiModel(description = "删除文件请求类")
public class DeleteFileRequest {
@ApiModelProperty(value = "存储源 key", required = true, example = "local")
@NotBlank(message = "存储源 key 不能为空")
private String storageKey;
@ApiModelProperty(value = "请求路径", example = "/", notes = "表示在哪个文件夹下删除文件")
@NotBlank(message = "请求路径不能为空")
private String path;
@ApiModelProperty(value = "删除的文件夹名称", example = "movie")
@NotBlank(message = "删除的文件名称不能为空")
private String name;
}

View File

@@ -1,30 +0,0 @@
package im.zhaojun.zfile.home.model.request.operator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 删除文件夹请求参数
*
* @author zhaojun
*/
@Data
@ApiModel(description = "删除文件夹请求类")
public class DeleteFolderRequest {
@ApiModelProperty(value = "存储源 key", required = true, example = "local")
@NotBlank(message = "存储源 key 不能为空")
private String storageKey;
@ApiModelProperty(value = "请求路径", example = "/", notes = "表示在哪个文件夹下删除文件夹")
@NotBlank(message = "请求路径不能为空")
private String path;
@ApiModelProperty(value = "删除的文件夹名称", example = "movie")
@NotBlank(message = "删除的文件夹名称不能为空")
private String name;
}

View File

@@ -0,0 +1,19 @@
package im.zhaojun.zfile.home.model.result;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author zhaojun
*/
@Data
@ApiModel(description = "批量生成直链结果类")
@AllArgsConstructor
public class BatchGenerateLinkResponse {
private String shortLink;
private String pathLink;
}