Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 2 commits into from
Aug 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 7 additions & 66 deletions server/src/main/java/cn/keking/utils/DownloadUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,11 @@
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.UUID;

import static cn.keking.utils.KkFileUtils.isFtpUrl;
Expand All @@ -40,7 +36,6 @@ public class DownloadUtils {
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
// 忽略ssl证书
String urlStr = null;
HttpURLConnection urlcon;
try {
SslUtils.ignoreSsl();
urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20");
Expand All @@ -49,7 +44,9 @@ public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, Strin
}
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
String realPath = getRelFilePath(fileName, fileAttribute);
if(!StringUtils.hasText(realPath)){

// 判断是否非法地址
if (KkFileUtils.isIllegalFileName(realPath)) {
response.setCode(1);
response.setContent(null);
response.setMsg("下载失败:文件名不合法!" + urlStr);
Expand All @@ -67,57 +64,14 @@ public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, Strin
response.setMsg(fileName);
return response;
}
if(realPath.equals("cunzhai")){
response.setContent(fileDir + fileName);
// 如果文件是否已经存在、且不强制更新,则直接返回文件路径
if (KkFileUtils.isExist(realPath) && !fileAttribute.forceUpdatedCache()) {
response.setContent(realPath);
response.setMsg(fileName);
return response;
}
try {
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 (isHttpUrl(url)) {
File realFile = new File(realPath);
Expand Down Expand Up @@ -163,25 +117,12 @@ private static String getRelFilePath(String fileName, FileAttribute fileAttribut
} else { // 文件后缀不一致时,以type为准(针对simText【将类txt文件转为txt】)
fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type);
}
// 判断是否非法地址
if (KkFileUtils.isIllegalFileName(fileName)) {
return null;
}

String realPath = fileDir + fileName;
File dirFile = new File(fileDir);
if (!dirFile.exists() && !dirFile.mkdirs()) {
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;
}

Expand Down
36 changes: 26 additions & 10 deletions server/src/main/java/cn/keking/utils/KkFileUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,33 @@ public class KkFileUtils {

/**
* 检查文件名是否合规
*
* @param fileName 文件名
* @return 合规结果,true:不合规,false:合规
* @return 合规结果, true:不合规,false:合规
*/
public static boolean isIllegalFileName(String fileName){
for (String str: illegalFileStrList){
if(fileName.contains(str)){
public static boolean isIllegalFileName(String fileName) {
for (String str : illegalFileStrList) {
if (fileName.contains(str)) {
return true;
}
}
return false;
}

/**
* 检查是否是数字
*
* @param str 文件名
* @return 合规结果,true:不合规,false:合规
* @return 合规结果, true:不合规,false:合规
*/
public static boolean isInteger(String str) {
if(StringUtils.hasText(str)){
if (StringUtils.hasText(str)) {
boolean strResult = str.matches("-?[0-9]+.?[0-9]*");
return strResult ;
return strResult;
}
return false;
}

/**
* 判断url是否是http资源
*
Expand Down Expand Up @@ -102,7 +106,7 @@ public static boolean deleteFileByName(String fileName) {


public static String htmlEscape(String input) {
if(StringUtils.hasText(input)){
if (StringUtils.hasText(input)) {
//input = input.replaceAll("\\{", "%7B").replaceAll("}", "%7D").replaceAll("\\\\", "%5C");
String htmlStr = HtmlUtils.htmlEscape(input, "UTF-8");
//& -> &amp;
Expand Down Expand Up @@ -186,11 +190,23 @@ public static boolean deleteDirectory(String dir) {
*/
public static boolean isAllowedUpload(String file) {
String fileType = suffixFromFileName(file);
for (String type : ConfigConstants.getProhibit()) {
if (type.equals(fileType))
for (String type : ConfigConstants.getProhibit()) {
if (type.equals(fileType)){
return false;
}
}
return !ObjectUtils.isEmpty(fileType);
}

/**
* 判断文件是否存在
*
* @param filePath 文件路径
* @return 是否存在 true:存在,false:不存在
*/
public static boolean isExist(String filePath) {
File file = new File(filePath);
return file.exists();
}

}
Loading