mirror of
https://gitee.com/kekingcn/file-online-preview.git
synced 2025-12-21 19:09:54 +08:00
* 1. 修复getCorsFile接口高危安全漏洞 * 1. 优化密码错误提示(“密码错误,请重新输入密码。”) * 1. 修复PPT重复预览bug,此bug导致ppt每次预览会执行两次转换(请求两次onlinePreview接口),在大文件尤其耗时(双倍时… * 1. 【加密office预览】优化受密码保护的office文件检查逻辑,提升旧文件格式的兼容性 * 1. 【加密office预览】优化office文件是否受密码保护判断逻辑,避免兼容性误判 * 1. 【加密office预览】优化重新输入密码提示。 * 1. 【加密office预览】优化当密码输入错误后,不是抛出异常,而是提示用户重新输入 * 1. 优化prompt提示框的输入密码提示样式 * 1. 实现基于userToken缓存加密文件,没有userToken的加密文件不缓存 * 1. 优化docker构建方案,使用分层构建方式,采用层级缓存解决构建慢发布慢等问题。从原本5分钟左右缩短至几秒 * 1. 加密文件暂时不缓存(后续基于用户token实现,基于用户缓存) * 1. 优化office文件下载逻辑,跳过重复下载(大量节约带宽与磁盘空间)。 * 1. 修复预览不同类型的加密office文件bug * 实现预览加密的(受密码保护)office文件
101 lines
3.9 KiB
Java
101 lines
3.9 KiB
Java
package cn.keking.utils;
|
||
|
||
import cn.keking.config.ConfigConstants;
|
||
import cn.keking.model.FileAttribute;
|
||
import cn.keking.model.ReturnResponse;
|
||
import io.mola.galimatias.GalimatiasParseException;
|
||
import org.apache.commons.io.FileUtils;
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
|
||
import java.io.*;
|
||
import java.net.*;
|
||
import java.util.UUID;
|
||
|
||
import static cn.keking.utils.KkFileUtils.isFtpUrl;
|
||
import static cn.keking.utils.KkFileUtils.isHttpUrl;
|
||
|
||
/**
|
||
* @author yudian-it
|
||
*/
|
||
public class DownloadUtils {
|
||
|
||
private final static Logger logger = LoggerFactory.getLogger(DownloadUtils.class);
|
||
private static final String fileDir = ConfigConstants.getFileDir();
|
||
private static final String URL_PARAM_FTP_USERNAME = "ftp.username";
|
||
private static final String URL_PARAM_FTP_PASSWORD = "ftp.password";
|
||
private static final String URL_PARAM_FTP_CONTROL_ENCODING = "ftp.control.encoding";
|
||
|
||
/**
|
||
* @param fileAttribute fileAttribute
|
||
* @param fileName 文件名
|
||
* @return 本地文件绝对路径
|
||
*/
|
||
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
|
||
String urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20");
|
||
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
|
||
String realPath = DownloadUtils.getRelFilePath(fileName, fileAttribute);
|
||
try {
|
||
URL url = WebUtils.normalizedURL(urlStr);
|
||
if (!fileAttribute.getSkipDownLoad()) {
|
||
if (isHttpUrl(url)) {
|
||
File realFile = new File(realPath);
|
||
FileUtils.copyURLToFile(url, realFile);
|
||
} else if (isFtpUrl(url)) {
|
||
String ftpUsername = WebUtils.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_USERNAME);
|
||
String ftpPassword = WebUtils.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_PASSWORD);
|
||
String ftpControlEncoding = WebUtils.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_CONTROL_ENCODING);
|
||
FtpUtils.download(fileAttribute.getUrl(), realPath, ftpUsername, ftpPassword, ftpControlEncoding);
|
||
} else {
|
||
response.setCode(1);
|
||
response.setMsg("url不能识别url" + urlStr);
|
||
}
|
||
}
|
||
response.setContent(realPath);
|
||
response.setMsg(fileName);
|
||
return response;
|
||
} catch (IOException | GalimatiasParseException e) {
|
||
logger.error("文件下载失败,url:{}", urlStr, e);
|
||
response.setCode(1);
|
||
response.setContent(null);
|
||
if (e instanceof FileNotFoundException) {
|
||
response.setMsg("文件不存在!!!");
|
||
} else {
|
||
response.setMsg(e.getMessage());
|
||
}
|
||
return response;
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取真实文件绝对路径
|
||
*
|
||
* @param fileName 文件名
|
||
* @return 文件路径
|
||
*/
|
||
private static String getRelFilePath(String fileName, FileAttribute fileAttribute) {
|
||
String type = fileAttribute.getSuffix();
|
||
if (null == fileName) {
|
||
UUID uuid = UUID.randomUUID();
|
||
fileName = uuid + "." + type;
|
||
} else { // 文件后缀不一致时,以type为准(针对simText【将类txt文件转为txt】)
|
||
fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type);
|
||
}
|
||
String realPath = fileDir + fileName;
|
||
File dirFile = new File(fileDir);
|
||
if (!dirFile.exists() && !dirFile.mkdirs()) {
|
||
logger.error("创建目录【{}】失败,可能是权限不够,请检查", fileDir);
|
||
}
|
||
|
||
// 文件已在本地存在,跳过文件下载
|
||
File realFile = new File(realPath);
|
||
if (realFile.exists()) {
|
||
fileAttribute.setSkipDownLoad(true);
|
||
}
|
||
|
||
return realPath;
|
||
}
|
||
|
||
}
|