diff --git a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaAppMaxDurationProperties.java b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaAppMaxDurationProperties.java index bf14c4a4..63151533 100644 --- a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaAppMaxDurationProperties.java +++ b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaAppMaxDurationProperties.java @@ -10,5 +10,5 @@ package ink.wgink.module.file.config.properties; * @Date: 2020/5/31 16:50 * @Version: 1.0 **/ -public class FileMediaAppMaxDurationProperties extends com.cm.common.config.properties.FileMediaBaseMaxDurationProperties { +public class FileMediaAppMaxDurationProperties extends FileMediaBaseMaxDurationProperties { } diff --git a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaBackendMaxDurationProperties.java b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaBackendMaxDurationProperties.java index d8db4375..6b9d1112 100644 --- a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaBackendMaxDurationProperties.java +++ b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaBackendMaxDurationProperties.java @@ -10,5 +10,5 @@ package ink.wgink.module.file.config.properties; * @Date: 2020/5/31 16:50 * @Version: 1.0 **/ -public class FileMediaBackendMaxDurationProperties extends com.cm.common.config.properties.FileMediaBaseMaxDurationProperties { +public class FileMediaBackendMaxDurationProperties extends FileMediaBaseMaxDurationProperties { } diff --git a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaMaxDurationProperties.java b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaMaxDurationProperties.java index 794546c3..c3066bfe 100644 --- a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaMaxDurationProperties.java +++ b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaMaxDurationProperties.java @@ -13,7 +13,7 @@ package ink.wgink.module.file.config.properties; public class FileMediaMaxDurationProperties { private FileMediaBackendMaxDurationProperties backend; - private com.cm.common.config.properties.FileMediaAppMaxDurationProperties app; + private FileMediaAppMaxDurationProperties app; private FileMediaWechatMaxDurationProperties wechat; public FileMediaBackendMaxDurationProperties getBackend() { @@ -24,11 +24,11 @@ public class FileMediaMaxDurationProperties { this.backend = backend; } - public com.cm.common.config.properties.FileMediaAppMaxDurationProperties getApp() { + public FileMediaAppMaxDurationProperties getApp() { return app; } - public void setApp(com.cm.common.config.properties.FileMediaAppMaxDurationProperties app) { + public void setApp(FileMediaAppMaxDurationProperties app) { this.app = app; } diff --git a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaWechatMaxDurationProperties.java b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaWechatMaxDurationProperties.java index 7215f9e1..be1f0f7c 100644 --- a/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaWechatMaxDurationProperties.java +++ b/module-file/src/main/java/ink/wgink/module/file/config/properties/FileMediaWechatMaxDurationProperties.java @@ -10,5 +10,5 @@ package ink.wgink.module.file.config.properties; * @Date: 2020/5/31 16:50 * @Version: 1.0 **/ -public class FileMediaWechatMaxDurationProperties extends com.cm.common.config.properties.FileMediaBaseMaxDurationProperties { +public class FileMediaWechatMaxDurationProperties extends FileMediaBaseMaxDurationProperties { } diff --git a/module-file/src/main/java/ink/wgink/module/file/controller/api/FileController.java b/module-file/src/main/java/ink/wgink/module/file/controller/api/FileController.java new file mode 100644 index 00000000..56aa26a5 --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/controller/api/FileController.java @@ -0,0 +1,172 @@ +package ink.wgink.module.file.controller.api; + +import com.alibaba.fastjson.JSONObject; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.file.config.properties.FileProperties; +import ink.wgink.module.file.enums.UploadTypeEnum; +import ink.wgink.module.file.pojo.dtos.FileDTO; +import ink.wgink.module.file.pojo.dtos.FileInfoDTO; +import ink.wgink.module.file.service.IFileService; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResult; +import ink.wgink.pojo.result.SuccessResultData; +import ink.wgink.pojo.result.SuccessResultList; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @ClassName: FileController + * @Description: 文件处理 + * @Author: WangGeng + * @Date: 2019/3/10 7:03 PM + * @Version: 1.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "文件管理接口") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/file") +public class FileController extends DefaultBaseController { + + @Autowired + private IFileService fileService; + @Autowired + private FileProperties fileProperties; + + @ApiOperation(value = "文件分页列表", notes = "文件分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"), + @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"), + @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("listpageinfo") + public SuccessResultList> listPageInfo(ListPage page) { + Map params = requestParams(); + page.setParams(params); + return fileService.listPageInfo(page); + } + + @ApiOperation(value = "删除文章类别(id列表)", notes = "删除文章类别(id列表)接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids", value = "ID列表,用下划线分隔", paramType = "path", example = "1_2_3") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @DeleteMapping("remove/{isRemoveSource}/{ids}") + public synchronized SuccessResult remove(@PathVariable() Integer isRemoveSource, @PathVariable("ids") String ids) { + if (isRemoveSource == 0) { + fileService.remove(ids); + } + if (isRemoveSource == 1) { + fileService.delete(ids); + } + return new SuccessResult(); + } + + @ApiOperation(value = "上传文件", notes = "上传文件接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadfile") + public SuccessResultData uploadFile(@RequestParam("file") MultipartFile file) { + Map params = requestParams(); + return uploadSingle(file, UploadTypeEnum.FILE, params); + } + + @ApiOperation(value = "上传图片", notes = "上传图片接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "image", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadimage") + public SuccessResultData uploadImage(@RequestParam("image") MultipartFile image) { + Map params = requestParams(); + return uploadSingle(image, UploadTypeEnum.IMAGE, params); + } + + @ApiOperation(value = "上传视频", notes = "上传视频接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "video", value = "文件video", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadvideo") + public SuccessResultData uploadVideo(@RequestParam("video") MultipartFile video) { + if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getBackend() != null) { + fileService.checkVideoDurationAllow(video, fileProperties.getMediaMaxDuration().getBackend().getVideo()); + } + Map params = requestParams(); + return uploadSingle(video, UploadTypeEnum.VIDEO, params); + } + + @ApiOperation(value = "上传音频", notes = "上传音频接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "audio", value = "文件audio", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadaudio") + public SuccessResultData uploadAudio(@RequestParam("audio") MultipartFile audio) { + if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getBackend() != null) { + fileService.checkAudioDurationAllow(audio, fileProperties.getMediaMaxDuration().getBackend().getAudio()); + } + Map params = requestParams(); + return uploadSingle(audio, UploadTypeEnum.AUDIO, params); + } + + @ApiOperation(value = "文件列表", notes = "文件列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids", value = "id列表,逗号分隔", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List listFileByFileId(@RequestParam("ids") String ids) { + List idList = Arrays.asList(ids.split(",")); + return fileService.list(idList); + } + + /** + * 上传文件 + * + * @param uploadFile + * @param params + * @return + */ + private SuccessResultData uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map params) { + return fileService.uploadSingle(uploadFile, uploadTypeEnum, params); + } + + /** + * 百度富文本编辑器 + * + * @param file + * @return + * @throws IOException + */ + @RequestMapping("ueditor") + public JSONObject uEditor(MultipartFile file, HttpServletRequest request) throws IOException { + Map params = requestParams(); + return fileService.uEditor(file, request, params); + } + + @ApiOperation(value = "上传图片", notes = "上传图片接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "image", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("wangeditorimage") + public JSONObject wangEditorImage(MultipartFile image, HttpServletRequest request) { + Map params = requestParams(); + return fileService.wangEditorImage(image, UploadTypeEnum.IMAGE, params); + } + +} diff --git a/module-file/src/main/java/ink/wgink/module/file/controller/app/api/FileAppController.java b/module-file/src/main/java/ink/wgink/module/file/controller/app/api/FileAppController.java new file mode 100644 index 00000000..826b16cd --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/controller/app/api/FileAppController.java @@ -0,0 +1,129 @@ +package ink.wgink.module.file.controller.app.api; + +import com.alibaba.fastjson.JSONObject; +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.file.config.properties.FileProperties; +import ink.wgink.module.file.enums.UploadTypeEnum; +import ink.wgink.module.file.pojo.dtos.FileDTO; +import ink.wgink.module.file.service.IFileService; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResultData; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: FileAppController + * @Description: APP文件上传 + * @Author: WangGeng + * @Date: 2019-08-02 15:38 + * @Version: 1.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_APP_PREFIX + "文件管理接口") +@RestController +@RequestMapping(ISystemConstant.APP_PREFIX + "/file") +public class FileAppController extends DefaultBaseController { + + @Autowired + private IFileService fileService; + @Autowired + private FileProperties fileProperties; + + @ApiOperation(value = "上传文件", notes = "上传文件接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "file", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadfile") + public SuccessResultData uploadFile(@RequestHeader("token") String token, @RequestParam("file") MultipartFile file) { + Map params = requestParams(); + return uploadSingle(token, file, UploadTypeEnum.FILE, params); + } + + @ApiOperation(value = "上传图片", notes = "上传图片接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "image", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadimage") + public SuccessResultData uploadImage(@RequestHeader("token") String token, @RequestParam("image") MultipartFile image) { + Map params = requestParams(); + return uploadSingle(token, image, UploadTypeEnum.IMAGE, params); + } + + @ApiOperation(value = "上传视频", notes = "上传视频接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "video", value = "文件video", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadvideo") + public SuccessResultData uploadVideo(@RequestHeader("token") String token, @RequestParam("video") MultipartFile video) { + if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getApp() != null) { + fileService.checkVideoDurationAllow(video, fileProperties.getMediaMaxDuration().getApp().getVideo()); + } + Map params = requestParams(); + return uploadSingle(token, video, UploadTypeEnum.VIDEO, params); + } + + @ApiOperation(value = "上传音频", notes = "上传音频接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "audio", value = "文件audio", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadaudio") + public SuccessResultData uploadAudio(@RequestHeader("token") String token, @RequestParam("audio") MultipartFile audio) { + if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getApp() != null) { + fileService.checkAudioDurationAllow(audio, fileProperties.getMediaMaxDuration().getApp().getAudio()); + } + Map params = requestParams(); + return uploadSingle(token, audio, UploadTypeEnum.AUDIO, params); + } + + @ApiOperation(value = "上传图片", notes = "上传图片接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "image", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("wangeditorimage") + public JSONObject wangEditorImage(MultipartFile image, HttpServletRequest request) { + Map params = requestParams(); + return fileService.wangEditorImage(image, UploadTypeEnum.IMAGE, params); + } + + @ApiOperation(value = "文件列表", notes = "文件列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids", value = "id列表,逗号分隔", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List listFileByFileId(@RequestParam("ids") String ids) { + List idList = Arrays.asList(ids.split(",")); + return fileService.list(idList); + } + + /** + * 上传文件 + * + * @param uploadFile + * @param params + * @return + */ + private SuccessResultData uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map params) { + return fileService.uploadSingle(token, uploadFile, uploadTypeEnum, params); + } + +} diff --git a/module-file/src/main/java/ink/wgink/module/file/controller/route/FileRouteController.java b/module-file/src/main/java/ink/wgink/module/file/controller/route/FileRouteController.java new file mode 100644 index 00000000..f3ad6226 --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/controller/route/FileRouteController.java @@ -0,0 +1,149 @@ +package ink.wgink.module.file.controller.route; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.exceptions.ParamsException; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.file.config.properties.FileProperties; +import ink.wgink.module.file.service.IFileService; +import ink.wgink.pojo.result.ErrorResult; +import io.swagger.annotations.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +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.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * @ClassName: FileController + * @Description: 文件 + * @Author: WangGeng + * @Date: 2019/3/11 2:45 PM + * @Version: 1.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "文件管理接口") +@Controller +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/file") +public class FileRouteController extends DefaultBaseController { + + @Autowired + private IFileService fileService; + @Autowired + private FileProperties fileProperties; + + /** + * 文件页面 + * + * @return + */ + @GetMapping("listinfo") + public ModelAndView listFileInfo() { + ModelAndView mv = new ModelAndView("file/list-info"); + return mv; + } + + @ApiOperation(value = "打开文件上传", notes = "打开文件上传接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "uploadType", value = "文件类型,1:文件,2:图片,3:视频,4:音频", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("uploadfile/{uploadType}") + public ModelAndView uploadFile(@PathVariable("uploadType") String uploadType) { + ModelAndView mv = new ModelAndView("file/file-upload"); + return getUploadFileModelAndView(mv, uploadType); + } + + private ModelAndView getUploadFileModelAndView(ModelAndView mv, String uploadType) { + if (!IFileService.UPLOAD_FILE_TYPE.equals(uploadType) && + !IFileService.UPLOAD_IMAGE_TYPE.equals(uploadType) && + !IFileService.UPLOAD_VIDEO_TYPE.equals(uploadType) && + !IFileService.UPLOAD_AUDIO_TYPE.equals(uploadType)) { + throw new ParamsException("参数错误"); + } + if (IFileService.UPLOAD_FILE_TYPE.equals(uploadType)) { + mv.addObject("uploadPath", "uploadfile"); + mv.addObject("updateInputName", "file"); + mv.addObject("allowFiles", fileProperties.getFileTypes()); + } + if (IFileService.UPLOAD_IMAGE_TYPE.equals(uploadType)) { + mv.addObject("uploadPath", "uploadimage"); + mv.addObject("updateInputName", "image"); + mv.addObject("allowFiles", fileProperties.getImageTypes()); + } + if (IFileService.UPLOAD_VIDEO_TYPE.equals(uploadType)) { + mv.addObject("uploadPath", "uploadvideo"); + mv.addObject("updateInputName", "video"); + mv.addObject("allowFiles", fileProperties.getVideoTypes()); + } + if (IFileService.UPLOAD_AUDIO_TYPE.equals(uploadType)) { + mv.addObject("uploadPath", "uploadaudio"); + mv.addObject("updateInputName", "audio"); + mv.addObject("allowFiles", fileProperties.getAudioTypes()); + } + mv.addObject("uploadType", uploadType); + mv.addObject("maxFileCount", fileProperties.getMaxFileCount()); + return mv; + } + + /** + * 上传图片 + * + * @return + */ + @GetMapping("uploadimage") + public ModelAndView uploadImage() { + Map params = requestParams(); + ModelAndView mv = new ModelAndView("file/image-upload"); + return getUploadImageModelAndView(mv, params); + } + + private ModelAndView getUploadImageModelAndView(ModelAndView mv, Map params) { + if (!StringUtils.isBlank(params.get("fileId") == null ? null : params.get("fileId").toString())) { + mv.addObject("fileId", params.get("fileId")); + } else { + mv.addObject("fileId", ""); + } + return mv; + } + + @ApiOperation(value = "下载文件", notes = "下载文件接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "isOpen", value = "是否打开,true和false", paramType = "path"), + @ApiImplicitParam(name = "fileId", value = "文件ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("download/{isOpen}/{fileId}") + public void downLoad(HttpServletRequest request, HttpServletResponse response, @PathVariable("isOpen") String isOpen, @PathVariable("fileId") String fileId) { + if (!ISystemConstant.IS_TRUE.equals(isOpen) && !ISystemConstant.IS_FALSE.equals(isOpen)) { + throw new ParamsException("参数错误"); + } + if (fileId.indexOf(".") > 0) { + fileId = fileId.split("\\.")[0]; + } + Map params = requestParams(); + params.put("fileId", fileId); + params.put("isOpen", isOpen); + fileService.downLoadFile(request, response, params); + } + + /** + * 显示文件 + * + * @param type + * @param fileId + * @return + */ + @GetMapping("show/{type}/{fileId}") + public ModelAndView show(@PathVariable("type") String type, @PathVariable("fileId") String fileId) { + ModelAndView mv = new ModelAndView("file/show"); + mv.addObject("type", type); + mv.addObject("fileId", fileId); + return mv; + } + +} diff --git a/module-file/src/main/java/ink/wgink/module/file/controller/wechat/FileWechatController.java b/module-file/src/main/java/ink/wgink/module/file/controller/wechat/FileWechatController.java new file mode 100644 index 00000000..a05b805d --- /dev/null +++ b/module-file/src/main/java/ink/wgink/module/file/controller/wechat/FileWechatController.java @@ -0,0 +1,115 @@ +package ink.wgink.module.file.controller.wechat; + +import ink.wgink.common.base.DefaultBaseController; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.module.file.config.properties.FileProperties; +import ink.wgink.module.file.enums.UploadTypeEnum; +import ink.wgink.module.file.pojo.dtos.FileDTO; +import ink.wgink.module.file.service.IFileService; +import ink.wgink.pojo.result.ErrorResult; +import ink.wgink.pojo.result.SuccessResultData; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: FileWechatController + * @Description: 微信文件 + * @Author: WangGeng + * @Date: 2020/3/8 9:39 上午 + * @Version: 1.0 + **/ +@Api(tags = ISystemConstant.API_TAGS_WECHAT_PREFIX + "文件管理接口") +@RestController +@RequestMapping(ISystemConstant.WECHAT_PREFIX + "/file") +public class FileWechatController extends DefaultBaseController { + + @Autowired + private IFileService fileService; + @Autowired + private FileProperties fileProperties; + + @ApiOperation(value = "上传文件", notes = "上传文件接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "file", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadfile") + public SuccessResultData uploadFile(@RequestHeader("token") String token, @RequestParam("file") MultipartFile file) { + Map params = requestParams(); + return uploadSingle(token, file, UploadTypeEnum.FILE, params); + } + + @ApiOperation(value = "上传图片", notes = "上传图片接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "image", value = "文件name", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadimage") + public SuccessResultData uploadImage(@RequestHeader("token") String token, @RequestParam("image") MultipartFile image) { + Map params = requestParams(); + return uploadSingle(token, image, UploadTypeEnum.IMAGE, params); + } + + @ApiOperation(value = "上传视频", notes = "上传视频接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "video", value = "文件video", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadvideo") + public SuccessResultData uploadVideo(@RequestHeader("token") String token, @RequestParam("video") MultipartFile video) { + if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getWechat() != null) { + fileService.checkVideoDurationAllow(video, fileProperties.getMediaMaxDuration().getWechat().getVideo()); + } + Map params = requestParams(); + return uploadSingle(token, video, UploadTypeEnum.VIDEO, params); + } + + @ApiOperation(value = "上传音频", notes = "上传音频接口") + @ApiImplicitParams({@ApiImplicitParam(name = "token", value = "token", paramType = "header"), + @ApiImplicitParam(name = "audio", value = "文件audio", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("uploadaudio") + public SuccessResultData uploadAudio(@RequestHeader("token") String token, @RequestParam("audio") MultipartFile audio) { + if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getWechat() != null) { + fileService.checkAudioDurationAllow(audio, fileProperties.getMediaMaxDuration().getWechat().getAudio()); + } + Map params = requestParams(); + return uploadSingle(token, audio, UploadTypeEnum.AUDIO, params); + } + + @ApiOperation(value = "文件列表", notes = "文件列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids", value = "id列表,逗号分隔", paramType = "query") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List list(@RequestParam("ids") String ids) { + List idList = Arrays.asList(ids.split(",")); + return fileService.list(idList); + } + + /** + * 上传文件 + * + * @param uploadFile + * @param params + * @return + */ + private SuccessResultData uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map params) { + return fileService.uploadSingle(token, uploadFile, uploadTypeEnum, params); + } + +} diff --git a/module-file/src/main/resources/templates/file/file-upload.html b/module-file/src/main/resources/templates/file/file-upload.html new file mode 100644 index 00000000..94bd7bf6 --- /dev/null +++ b/module-file/src/main/resources/templates/file/file-upload.html @@ -0,0 +1,81 @@ + + + + + + + + + + + +
+
+
+ +
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/module-file/src/main/resources/templates/file/image-upload.html b/module-file/src/main/resources/templates/file/image-upload.html new file mode 100644 index 00000000..54d0d7c9 --- /dev/null +++ b/module-file/src/main/resources/templates/file/image-upload.html @@ -0,0 +1,174 @@ + + + + + + + + + + + +
+
+
+ + +
+
+
+
+
+ + + + +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/module-file/src/main/resources/templates/file/list-info.html b/module-file/src/main/resources/templates/file/list-info.html new file mode 100644 index 00000000..745d84a0 --- /dev/null +++ b/module-file/src/main/resources/templates/file/list-info.html @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ +
+
+ +
+
+ +
+ +
+
+ + +
+
+
+
+ +
+ + + + + + \ No newline at end of file diff --git a/module-file/src/main/resources/templates/file/show.html b/module-file/src/main/resources/templates/file/show.html new file mode 100644 index 00000000..b8e24219 --- /dev/null +++ b/module-file/src/main/resources/templates/file/show.html @@ -0,0 +1,24 @@ + + + + + + + + + + + +
+
+ 加载失败 + +
+
+ + + + \ No newline at end of file diff --git a/module-file/src/main/resources/ueditorconfig.json b/module-file/src/main/resources/ueditorconfig.json new file mode 100644 index 00000000..9aeeabd4 --- /dev/null +++ b/module-file/src/main/resources/ueditorconfig.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "file", /* 提交的图片表单名称 */ + "imageMaxSize": 102400000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": "/files/images/{yyyy}{mm}{dd}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadimage", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "file", /* 提交的图片表单名称 */ + "scrawlPathFormat": "/files/images/{yyyy}{mm}{dd}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/files/images/{yyyy}{mm}{dd}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "uploadimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "file", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/files/images/{yyyy}{mm}{dd}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "file", /* 提交的视频表单名称 */ + "videoPathFormat": "/files/videos/{yyyy}{mm}{dd}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 10240000000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "file", /* 提交的文件表单名称 */ + "filePathFormat": "/files/files/{yyyy}{mm}{dd}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".apk", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/files/images/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/files/files/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file