重构下载文件的代码,修复文件重新下载的问题 (#485)

* 重构下载文件的代码,修复文件重新下载的问题

* fix: 修复可能得空指针问题
This commit is contained in:
kl
2023-08-31 10:47:41 +08:00
committed by GitHub
parent c2abe2f34c
commit 692bb8f964
2 changed files with 33 additions and 76 deletions

View File

@@ -7,15 +7,11 @@ import io.mola.galimatias.GalimatiasParseException;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.net.URLDecoder;
import java.util.UUID; import java.util.UUID;
import static cn.keking.utils.KkFileUtils.isFtpUrl; import static cn.keking.utils.KkFileUtils.isFtpUrl;
@@ -40,7 +36,6 @@ public class DownloadUtils {
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) { public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
// 忽略ssl证书 // 忽略ssl证书
String urlStr = null; String urlStr = null;
HttpURLConnection urlcon;
try { try {
SslUtils.ignoreSsl(); SslUtils.ignoreSsl();
urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20"); urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20");
@@ -49,7 +44,9 @@ public class DownloadUtils {
} }
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", ""); ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
String realPath = getRelFilePath(fileName, fileAttribute); String realPath = getRelFilePath(fileName, fileAttribute);
if(!StringUtils.hasText(realPath)){
// 判断是否非法地址
if (KkFileUtils.isIllegalFileName(realPath)) {
response.setCode(1); response.setCode(1);
response.setContent(null); response.setContent(null);
response.setMsg("下载失败:文件名不合法!" + urlStr); response.setMsg("下载失败:文件名不合法!" + urlStr);
@@ -67,57 +64,14 @@ public class DownloadUtils {
response.setMsg(fileName); response.setMsg(fileName);
return response; return response;
} }
if(realPath.equals("cunzhai")){ // 如果文件是否已经存在、且不强制更新,则直接返回文件路径
response.setContent(fileDir + fileName); if (KkFileUtils.isExist(realPath) && !fileAttribute.forceUpdatedCache()) {
response.setContent(realPath);
response.setMsg(fileName); response.setMsg(fileName);
return response; return response;
} }
try { try {
URL url = WebUtils.normalizedURL(urlStr); URL url = WebUtils.normalizedURL(urlStr);
if (!urlStr.toLowerCase().startsWith("ftp:")&& !urlStr.toLowerCase().startsWith("file")){
urlcon=(HttpURLConnection)url.openConnection();
urlcon.setConnectTimeout(30000);
urlcon.setReadTimeout(30000);
urlcon.setInstanceFollowRedirects(false);
int responseCode = urlcon.getResponseCode();
if(responseCode != 200){
if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { //301 302
url =new URL(urlcon.getHeaderField("Location"));
}
if (responseCode == 403|| responseCode == 500) { //301 302
response.setCode(1);
response.setContent(null);
response.setMsg("下载失败:地址错误!" + urlStr);
return response;
}
if (responseCode == 404 ) { //404
try {
urlStr = URLDecoder.decode(urlStr, "UTF-8");
urlStr = URLDecoder.decode(urlStr, "UTF-8");
url = WebUtils.normalizedURL(urlStr);
urlcon=(HttpURLConnection)url.openConnection();
urlcon.setConnectTimeout(30000);
urlcon.setReadTimeout(30000);
urlcon.setInstanceFollowRedirects(false);
responseCode = urlcon.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { //301 302
url =new URL(urlcon.getHeaderField("Location"));
}
if(responseCode == 404 ||responseCode == 403|| responseCode == 500 ){
response.setCode(1);
response.setContent(null);
response.setMsg("下载失败:地址错误!" + urlStr);
return response;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}finally {
assert urlcon != null;
urlcon.disconnect();
}
}
}
}
if (!fileAttribute.getSkipDownLoad()) { if (!fileAttribute.getSkipDownLoad()) {
if (isHttpUrl(url)) { if (isHttpUrl(url)) {
File realFile = new File(realPath); File realFile = new File(realPath);
@@ -163,25 +117,12 @@ public class DownloadUtils {
} else { // 文件后缀不一致时以type为准(针对simText【将类txt文件转为txt】) } else { // 文件后缀不一致时以type为准(针对simText【将类txt文件转为txt】)
fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type); fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type);
} }
// 判断是否非法地址
if (KkFileUtils.isIllegalFileName(fileName)) {
return null;
}
String realPath = fileDir + fileName; String realPath = fileDir + fileName;
File dirFile = new File(fileDir); File dirFile = new File(fileDir);
if (!dirFile.exists() && !dirFile.mkdirs()) { if (!dirFile.exists() && !dirFile.mkdirs()) {
logger.error("创建目录【{}】失败,可能是权限不够,请检查", fileDir); logger.error("创建目录【{}】失败,可能是权限不够,请检查", fileDir);
} }
Boolean forceUpdatedCache = fileAttribute.forceUpdatedCache();
//判断是否启用强制更新功能如果启用 文件必须重新下载
if (null == forceUpdatedCache || !forceUpdatedCache) {
// 文件已在本地存在,跳过文件下载
File realFile = new File(realPath);
if (realFile.exists()) {
fileAttribute.setSkipDownLoad(true);
return "cunzhai"; //这里给的值是不能修改的 对应的是下载方法里面有个强制输出地址的
}
}
return realPath; return realPath;
} }

View File

@@ -34,29 +34,33 @@ public class KkFileUtils {
/** /**
* 检查文件名是否合规 * 检查文件名是否合规
*
* @param fileName 文件名 * @param fileName 文件名
* @return 合规结果,true:不合规false:合规 * @return 合规结果, true:不合规false:合规
*/ */
public static boolean isIllegalFileName(String fileName){ public static boolean isIllegalFileName(String fileName) {
for (String str: illegalFileStrList){ for (String str : illegalFileStrList) {
if(fileName.contains(str)){ if (fileName.contains(str)) {
return true; return true;
} }
} }
return false; return false;
} }
/** /**
* 检查是否是数字 * 检查是否是数字
*
* @param str 文件名 * @param str 文件名
* @return 合规结果,true:不合规false:合规 * @return 合规结果, true:不合规false:合规
*/ */
public static boolean isInteger(String str) { public static boolean isInteger(String str) {
if(StringUtils.hasText(str)){ if (StringUtils.hasText(str)) {
boolean strResult = str.matches("-?[0-9]+.?[0-9]*"); boolean strResult = str.matches("-?[0-9]+.?[0-9]*");
return strResult ; return strResult;
} }
return false; return false;
} }
/** /**
* 判断url是否是http资源 * 判断url是否是http资源
* *
@@ -102,7 +106,7 @@ public class KkFileUtils {
public static String htmlEscape(String input) { public static String htmlEscape(String input) {
if(StringUtils.hasText(input)){ if (StringUtils.hasText(input)) {
//input = input.replaceAll("\\{", "%7B").replaceAll("}", "%7D").replaceAll("\\\\", "%5C"); //input = input.replaceAll("\\{", "%7B").replaceAll("}", "%7D").replaceAll("\\\\", "%5C");
String htmlStr = HtmlUtils.htmlEscape(input, "UTF-8"); String htmlStr = HtmlUtils.htmlEscape(input, "UTF-8");
//& -> &amp; //& -> &amp;
@@ -186,11 +190,23 @@ public class KkFileUtils {
*/ */
public static boolean isAllowedUpload(String file) { public static boolean isAllowedUpload(String file) {
String fileType = suffixFromFileName(file); String fileType = suffixFromFileName(file);
for (String type : ConfigConstants.getProhibit()) { for (String type : ConfigConstants.getProhibit()) {
if (type.equals(fileType)) if (type.equals(fileType)){
return false; return false;
}
} }
return !ObjectUtils.isEmpty(fileType); return !ObjectUtils.isEmpty(fileType);
} }
/**
* 判断文件是否存在
*
* @param filePath 文件路径
* @return 是否存在 true:存在false:不存在
*/
public static boolean isExist(String filePath) {
File file = new File(filePath);
return file.exists();
}
} }