mirror of
https://github.com/zfile-dev/zfile.git
synced 2025-04-19 05:34:52 +00:00
✨ 批量删除文件和批量删除直链功能
This commit is contained in:
@@ -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("删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user