diff --git a/login-app/src/main/java/ink/wgink/login/app/service/appversion/impl/AppVersionServiceImpl.java b/login-app/src/main/java/ink/wgink/login/app/service/appversion/impl/AppVersionServiceImpl.java index 69b7c62c..2b9f871c 100644 --- a/login-app/src/main/java/ink/wgink/login/app/service/appversion/impl/AppVersionServiceImpl.java +++ b/login-app/src/main/java/ink/wgink/login/app/service/appversion/impl/AppVersionServiceImpl.java @@ -167,9 +167,11 @@ public class AppVersionServiceImpl extends DefaultBaseService implements IAppVer Map params = getHashMap(4); params.put("fileId", appVersionPO.getAppFile()); params.put("isOpen", false); - fileService.downLoadFile(request, response, params, false); - LOG.debug("更新下载次数"); - appVersionDao.updateDownloadCount(appVersionPO.getAppVersionId()); + boolean isDownloadComplete = fileService.downLoadFile(request, response, params, false); + if(isDownloadComplete) { + LOG.debug("更新下载次数"); + appVersionDao.updateDownloadCount(appVersionPO.getAppVersionId()); + } } @Override diff --git a/module-file/src/main/java/ink/wgink/module/file/service/IDefaultFileService.java b/module-file/src/main/java/ink/wgink/module/file/service/IDefaultFileService.java index bcb17bd4..f0eaab82 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/IDefaultFileService.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/IDefaultFileService.java @@ -102,7 +102,8 @@ public interface IDefaultFileService { * @param filePO * @param isOpen * @param canRange + * @return 是否下载完成 */ - void downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange); + boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange); } diff --git a/module-file/src/main/java/ink/wgink/module/file/service/IFileService.java b/module-file/src/main/java/ink/wgink/module/file/service/IFileService.java index 108b75f3..792be513 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/IFileService.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/IFileService.java @@ -199,7 +199,7 @@ public interface IFileService { * @param params * @param canRange 开启断点续传 */ - void downLoadFile(HttpServletRequest request, HttpServletResponse response, Map params, boolean canRange); + boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, Map params, boolean canRange); /** * 百度富文本编辑器 diff --git a/module-file/src/main/java/ink/wgink/module/file/service/IMinIoFileService.java b/module-file/src/main/java/ink/wgink/module/file/service/IMinIoFileService.java index 5d573848..31382db7 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/IMinIoFileService.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/IMinIoFileService.java @@ -54,6 +54,6 @@ public interface IMinIoFileService { * @param isOpen * @param canRange */ - void downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange); + boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange); } diff --git a/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java index cc9b4b00..02df15e9 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/impl/DefaultFileServiceImpl.java @@ -282,7 +282,8 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau } @Override - public void downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange) { + public boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange) { + boolean isDownloadComplete = false; try ( RandomAccessFile randomAccessFile = new RandomAccessFile(filePO.getFilePath(), "r"); FileChannel fileChannel = randomAccessFile.getChannel(); @@ -303,7 +304,7 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau String ifModifiedSince = request.getHeader("If-Modified-Since"); if (StringUtils.isNotBlank(ifModifiedSince) && StringUtils.equalsIgnoreCase(ifModifiedSince, filePO.getGmtModified())) { response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - return; + return true; } // 缓存有效时间为7天 response.setHeader("Expires", DateTime.now().plusDays(7).toDateTime(DateTimeZone.forID("GMT")).toString()); @@ -336,14 +337,18 @@ public class DefaultFileServiceImpl extends DefaultBaseService implements IDefau long totalOutputLength = endRange - startRange + 1; fileChannel.transferTo(startRange, totalOutputLength, writableByteChannel); outputStream.flush(); + if (endRange == contentLength - 1) { + isDownloadComplete = true; + } } catch (Exception e) { + e.printStackTrace(); if (e instanceof ClientAbortException) { LOG.debug("客户端断开连接"); } else { - throw new FileException("文件输出异常", e); } } + return isDownloadComplete; } /** diff --git a/module-file/src/main/java/ink/wgink/module/file/service/impl/FileServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/impl/FileServiceImpl.java index 170ad777..fa110558 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/impl/FileServiceImpl.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/impl/FileServiceImpl.java @@ -224,7 +224,7 @@ public class FileServiceImpl extends DefaultBaseService implements IFileService } @Override - public void downLoadFile(HttpServletRequest request, HttpServletResponse response, Map params, boolean canRange) { + public boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, Map params, boolean canRange) { FilePO filePO = fileDao.getPO(params); if (null == filePO) { throw new FileException("文件不存在"); @@ -232,11 +232,10 @@ public class FileServiceImpl extends DefaultBaseService implements IFileService boolean isOpen = Boolean.valueOf(params.get("isOpen").toString()); // 没有备份的数据从本地下载 if (filePO.getIsBack() == 0) { - defaultFileService.downLoadFile(request, response, filePO, isOpen, canRange); - return; + return defaultFileService.downLoadFile(request, response, filePO, isOpen, canRange); } if (fileProperties.getUseMinIo()) { - minIoFileService.downLoadFile(request, response, filePO, isOpen, canRange); + return minIoFileService.downLoadFile(request, response, filePO, isOpen, canRange); } throw new FileException("文件下载异常"); } diff --git a/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java b/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java index 5b58d12a..2dfc1eb1 100644 --- a/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java +++ b/module-file/src/main/java/ink/wgink/module/file/service/impl/MinIoFileServiceImpl.java @@ -106,7 +106,8 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi } @Override - public void downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange) { + public boolean downLoadFile(HttpServletRequest request, HttpServletResponse response, FilePO filePO, boolean isOpen, boolean canRange) { + boolean isDownloadComplete = false; // minIo中文件名 String objectName = filePO.getFileId() + "." + filePO.getFileType(); InputStream inputStream = null; @@ -126,7 +127,7 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi String ifModifiedSince = request.getHeader("If-Modified-Since"); if (StringUtils.isNotBlank(ifModifiedSince) && StringUtils.equalsIgnoreCase(ifModifiedSince, filePO.getGmtModified())) { response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - return; + return true; } // 缓存有效时间为7天 response.setHeader("Expires", DateTime.now().plusDays(7).toDateTime(DateTimeZone.forID("GMT")).toString()); @@ -156,6 +157,9 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi } else { inputStream = minioClient.getObject(filePO.getFileUrl(), objectName); } + if (endRange == contentLength - 1) { + isDownloadComplete = true; + } } byte[] readBuf = new byte[IFileService.INPUT_STREAM_SIZE]; for (int length = 0; (length = inputStream.read(readBuf)) > 0; ) { @@ -174,6 +178,7 @@ public class MinIoFileServiceImpl extends DefaultBaseService implements IMinIoFi } } } + return isDownloadComplete; }