文件上传,下载异步

This commit is contained in:
wanggeng888 2021-04-17 12:53:57 +08:00
parent 3e1d92668a
commit 47afaba8cd
9 changed files with 83 additions and 149 deletions

View File

@ -27,6 +27,7 @@ import springfox.documentation.spring.web.DocumentationCache;
import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.net.URLDecoder;
import java.util.ArrayList;
@ -46,7 +47,11 @@ public class DefaultBaseController {
protected static final Logger LOG = LoggerFactory.getLogger(DefaultBaseController.class);
@Autowired
private HttpSession httpSession;
protected HttpSession httpSession;
@Autowired
protected HttpServletRequest httpServletRequest;
@Autowired
protected HttpServletResponse httpServletResponse;
/**
* 获取请求参数

View File

@ -19,6 +19,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.*;
@ -36,7 +38,11 @@ public class DefaultBaseService {
@Autowired
protected SecurityComponent securityComponent;
@Autowired
private HttpSession httpSession;
protected HttpSession httpSession;
@Autowired
protected HttpServletRequest httpServletRequest;
@Autowired
protected HttpServletResponse httpServletResponse;
/**
* 设置新增基础数据

View File

@ -1,6 +1,7 @@
package ink.wgink.login.app.controller.api.appsign;
package ink.wgink.login.app.controller.app.api.appsign;
import ink.wgink.annotation.CheckRequestBodyAnnotation;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.exceptions.ParamsException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.login.app.pojo.vos.appsign.AppLoginDefaultVO;
@ -19,6 +20,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
@ -32,7 +35,7 @@ import org.springframework.web.bind.annotation.RestController;
@Api(tags = ISystemConstant.API_TAGS_APP_PREFIX + "登录")
@RestController
@RequestMapping(ISystemConstant.APP_PREFIX + "/sign")
public class AppSignController {
public class AppSignAppController extends DefaultBaseController {
@Autowired
private IAppSignService appSignService;

View File

@ -17,12 +17,14 @@ import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* @ClassName: FileController
@ -79,9 +81,9 @@ public class FileController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadfile")
public SuccessResultData<String> uploadFile(@RequestParam("file") MultipartFile file) {
public Callable<SuccessResultData<String>> uploadFile(@RequestParam("file") MultipartFile file) {
Map<String, Object> params = requestParams();
return uploadSingle(file, UploadTypeEnum.FILE, params);
return asyncUploadSingle(file, UploadTypeEnum.FILE, params);
}
@ApiOperation(value = "上传图片", notes = "上传图片接口")
@ -90,9 +92,9 @@ public class FileController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadimage")
public SuccessResultData<String> uploadImage(@RequestParam("image") MultipartFile image) {
public Callable<SuccessResultData<String>> uploadImage(@RequestParam("image") MultipartFile image) {
Map<String, Object> params = requestParams();
return uploadSingle(image, UploadTypeEnum.IMAGE, params);
return asyncUploadSingle(image, UploadTypeEnum.IMAGE, params);
}
@ApiOperation(value = "上传视频", notes = "上传视频接口")
@ -101,12 +103,12 @@ public class FileController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadvideo")
public SuccessResultData<String> uploadVideo(@RequestParam("video") MultipartFile video) {
public Callable<SuccessResultData<String>> uploadVideo(@RequestParam("video") MultipartFile video) {
if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getBackend() != null) {
fileService.checkVideoDurationAllow(video, fileProperties.getMediaMaxDuration().getBackend().getVideo());
}
Map<String, Object> params = requestParams();
return uploadSingle(video, UploadTypeEnum.VIDEO, params);
return asyncUploadSingle(video, UploadTypeEnum.VIDEO, params);
}
@ApiOperation(value = "上传音频", notes = "上传音频接口")
@ -115,12 +117,12 @@ public class FileController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadaudio")
public SuccessResultData<String> uploadAudio(@RequestParam("audio") MultipartFile audio) {
public Callable<SuccessResultData<String>> uploadAudio(@RequestParam("audio") MultipartFile audio) {
if (fileProperties.getMediaMaxDuration() != null && fileProperties.getMediaMaxDuration().getBackend() != null) {
fileService.checkAudioDurationAllow(audio, fileProperties.getMediaMaxDuration().getBackend().getAudio());
}
Map<String, Object> params = requestParams();
return uploadSingle(audio, UploadTypeEnum.AUDIO, params);
return asyncUploadSingle(audio, UploadTypeEnum.AUDIO, params);
}
@ApiOperation(value = "文件列表", notes = "文件列表接口")
@ -142,7 +144,19 @@ public class FileController extends DefaultBaseController {
* @return
*/
private SuccessResultData<String> uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) {
return fileService.uploadSingle(uploadFile, uploadTypeEnum, params);
return new SuccessResultData<>(fileService.uploadSingle(uploadFile, uploadTypeEnum, params));
}
/**
* 异步上传
*
* @param uploadFile
* @param uploadTypeEnum
* @param params
* @return
*/
private Callable<SuccessResultData<String>> asyncUploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) {
return () -> new SuccessResultData<>(fileService.uploadSingle(uploadFile, uploadTypeEnum, params));
}
/**

View File

@ -18,6 +18,7 @@ import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* When you feel like quitting. Think about why you started
@ -46,9 +47,9 @@ public class FileAppController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadfile")
public SuccessResultData<String> uploadFile(@RequestHeader("token") String token, @RequestParam("file") MultipartFile file) {
public Callable<SuccessResultData<String>> uploadFile(@RequestHeader("token") String token, @RequestParam("file") MultipartFile file) {
Map<String, Object> params = requestParams();
return uploadSingle(token, file, UploadTypeEnum.FILE, params);
return asyncUploadSingle(token, file, UploadTypeEnum.FILE, params);
}
@ApiOperation(value = "上传图片", notes = "上传图片接口")
@ -58,9 +59,9 @@ public class FileAppController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadimage")
public SuccessResultData<String> uploadImage(@RequestHeader("token") String token, @RequestParam("image") MultipartFile image) {
public Callable<SuccessResultData<String>> uploadImage(@RequestHeader("token") String token, @RequestParam("image") MultipartFile image) {
Map<String, Object> params = requestParams();
return uploadSingle(token, image, UploadTypeEnum.IMAGE, params);
return asyncUploadSingle(token, image, UploadTypeEnum.IMAGE, params);
}
@ApiOperation(value = "上传视频", notes = "上传视频接口")
@ -70,12 +71,12 @@ public class FileAppController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadvideo")
public SuccessResultData<String> uploadVideo(@RequestHeader("token") String token, @RequestParam("video") MultipartFile video) {
public Callable<SuccessResultData<String>> 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<String, Object> params = requestParams();
return uploadSingle(token, video, UploadTypeEnum.VIDEO, params);
return asyncUploadSingle(token, video, UploadTypeEnum.VIDEO, params);
}
@ApiOperation(value = "上传音频", notes = "上传音频接口")
@ -85,12 +86,12 @@ public class FileAppController extends DefaultBaseController {
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("uploadaudio")
public SuccessResultData<String> uploadAudio(@RequestHeader("token") String token, @RequestParam("audio") MultipartFile audio) {
public Callable<SuccessResultData<String>> 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<String, Object> params = requestParams();
return uploadSingle(token, audio, UploadTypeEnum.AUDIO, params);
return asyncUploadSingle(token, audio, UploadTypeEnum.AUDIO, params);
}
@ApiOperation(value = "上传图片", notes = "上传图片接口")
@ -122,8 +123,8 @@ public class FileAppController extends DefaultBaseController {
* @param params
* @return
*/
private SuccessResultData<String> uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) {
return fileService.uploadSingle(token, uploadFile, uploadTypeEnum, params);
private Callable<SuccessResultData<String>> asyncUploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) {
return () -> new SuccessResultData<>(fileService.uploadSingle(token, uploadFile, uploadTypeEnum, params));
}
}

View File

@ -15,9 +15,11 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
/**
* @ClassName: FileController
@ -118,17 +120,35 @@ public class FileRouteController extends DefaultBaseController {
})
@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)) {
public void downLoad(HttpServletRequest request, HttpServletResponse response, @PathVariable("isOpen") Boolean isOpen, @PathVariable("fileId") String fileId) {
// 开启异步处理
AsyncContext asyncContext = request.startAsync(request, response);
CompletableFuture.runAsync(() -> {
asyncDownload(asyncContext, (HttpServletRequest) asyncContext.getRequest(), (HttpServletResponse) asyncContext.getResponse(), isOpen, fileId);
});
}
/**
* 异步下载文件
*
* @param asyncContext
* @param request
* @param response
* @param isOpen
* @param fileId
*/
private void asyncDownload(AsyncContext asyncContext, HttpServletRequest request, HttpServletResponse response, Boolean isOpen, String fileId) {
if (isOpen == null) {
throw new ParamsException("参数错误");
}
if (fileId.indexOf(".") > 0) {
fileId = fileId.split("\\.")[0];
}
Map<String, Object> params = requestParams();
Map<String, Object> params = getParams();
params.put("fileId", fileId);
params.put("isOpen", isOpen);
fileService.downLoadFile(request, response, params);
asyncContext.complete();
}
/**

View File

@ -1,115 +0,0 @@
package ink.wgink.module.file.controller.wechat;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.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<String> uploadFile(@RequestHeader("token") String token, @RequestParam("file") MultipartFile file) {
Map<String, Object> 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<String> uploadImage(@RequestHeader("token") String token, @RequestParam("image") MultipartFile image) {
Map<String, Object> 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<String> 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<String, Object> 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<String> 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<String, Object> 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<FileDTO> list(@RequestParam("ids") String ids) {
List<String> idList = Arrays.asList(ids.split(","));
return fileService.list(idList);
}
/**
* 上传文件
*
* @param uploadFile
* @param params
* @return
*/
private SuccessResultData<String> uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) {
return fileService.uploadSingle(token, uploadFile, uploadTypeEnum, params);
}
}

View File

@ -113,9 +113,9 @@ public interface IFileService {
* @param uploadFile
* @param uploadTypeEnum
* @param params
* @return
* @return 文件ID
*/
SuccessResultData<String> uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params);
String uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params);
/**
* 文件上传
@ -124,10 +124,10 @@ public interface IFileService {
* @param uploadFile
* @param uploadTypeEnum
* @param params
* @return
* @return 文件ID
* @throws IOException
*/
SuccessResultData<String> uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params);
String uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params);
/**
* 文件上传

View File

@ -174,15 +174,15 @@ public class FileServiceImpl extends DefaultBaseService implements IFileService
}
@Override
public SuccessResultData<String> uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) throws SystemException {
public String uploadSingle(MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) throws SystemException {
uploadFile(null, uploadFile, uploadTypeEnum, params);
return new SuccessResultData<>(params.get("fileId").toString());
return params.get("fileId").toString();
}
@Override
public SuccessResultData<String> uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) throws SystemException {
public String uploadSingle(String token, MultipartFile uploadFile, UploadTypeEnum uploadTypeEnum, Map<String, Object> params) throws SystemException {
uploadFile(token, uploadFile, uploadTypeEnum, params);
return new SuccessResultData<>(params.get("fileId").toString());
return params.get("fileId").toString();
}
@Override