Browse Source

备用域名地址

xiatian 5 years ago
parent
commit
fcb2298d9a

+ 13 - 2
src/main/java/cn/com/qmth/examcloud/web/aliyun/AliYunAccount.java

@@ -1,7 +1,7 @@
 package cn.com.qmth.examcloud.web.aliyun;
 
 /**
- *阿里云存储账号信息
+ * 阿里云存储账号信息
  */
 public class AliYunAccount {
 
@@ -10,6 +10,7 @@ public class AliYunAccount {
 	private String accessKeyId;
 	private String accessKeySecret;
 	private String domain;
+	private String domainBackup;
 
 	public String getBucket() {
 		return bucket;
@@ -51,13 +52,23 @@ public class AliYunAccount {
 		this.domain = domain;
 	}
 
-	public AliYunAccount(String bucket, String ossEndpoint, String accessKeyId, String accessKeySecret, String domain) {
+	public String getDomainBackup() {
+		return domainBackup;
+	}
+
+	public void setDomainBackup(String domainBackup) {
+		this.domainBackup = domainBackup;
+	}
+
+	public AliYunAccount(String bucket, String ossEndpoint, String accessKeyId, String accessKeySecret, String domain,
+			String domainBackup) {
 		super();
 		this.bucket = bucket;
 		this.ossEndpoint = ossEndpoint;
 		this.accessKeyId = accessKeyId;
 		this.accessKeySecret = accessKeySecret;
 		this.domain = domain;
+		this.domainBackup = domainBackup;
 	}
 
 }

+ 4 - 2
src/main/java/cn/com/qmth/examcloud/web/aliyun/AliyunSiteManager.java

@@ -53,6 +53,7 @@ public class AliyunSiteManager {
 			String accessKeyId = PropertyHolder.getString("$aliyun.site." + aliyunId + ".accessKeyId");
 			String accessKeySecret = PropertyHolder.getString("$aliyun.site." + aliyunId + ".accessKeySecret");
 			String domain = PropertyHolder.getString("$aliyun.site." + aliyunId + ".domain");
+			String domainBackup = PropertyHolder.getString("$aliyun.site." + aliyunId + ".domain.backup");
 
 			if (StringUtils.isBlank(bucket)) {
 				throw new StatusException("520001", "bucket is not configured. aliyunId=" + aliyunId);
@@ -70,7 +71,8 @@ public class AliyunSiteManager {
 				throw new StatusException("520005", "domain is not configured. aliyunId=" + aliyunId);
 			}
 			if (null == ACCOUNT_HOLDERS.get(aliyunId)) {
-				AliYunAccount ac = new AliYunAccount(bucket, ossEndpoint, accessKeyId, accessKeySecret, domain);
+				AliYunAccount ac = new AliYunAccount(bucket, ossEndpoint, accessKeyId, accessKeySecret, domain,
+						domainBackup);
 				ACCOUNT_HOLDERS.put(aliyunId, ac);
 			}
 		}
@@ -92,7 +94,7 @@ public class AliyunSiteManager {
 		}
 		return aliyunSite;
 	}
-	
+
 	public static AliYunAccount getAliYunAccountByAliyunId(String aliyunId) {
 		AliYunAccount ac = ACCOUNT_HOLDERS.get(aliyunId);
 

+ 6 - 0
src/main/java/cn/com/qmth/examcloud/web/filestorage/FileStorage.java

@@ -30,6 +30,12 @@ public interface FileStorage {
 	 */
 	public String realPath(String path);
 	
+	/**获取可直接访问的文件地址(备用域名地址)
+	 * @param path 全路径,包含根目录,不含协议名
+	 * @return 返回可直接访问的地址,如果没有配置备用地址,则返回主域名地址
+	 */
+	public String realPathBackup(String path);
+	
 	/**保存文件到存储服务,siteId为1,转换接口用
 	 * @param file 文件
 	 * @param path 全路径,含协议名

+ 25 - 1
src/main/java/cn/com/qmth/examcloud/web/filestorage/FileStorageUtil.java

@@ -284,7 +284,7 @@ public class FileStorageUtil {
 		try {
 			saveUrlAs(fileUrl, localFile.getAbsolutePath());
 		} catch (IOException e) {
-			throw new StatusException("1001", "下载文件出错",e);
+			throw new StatusException("5001", "下载文件出错",e);
 		}
 	}
 
@@ -341,4 +341,28 @@ public class FileStorageUtil {
 		FileStorage fs = SpringContextHolder.getBean(getHead(path).toLowerCase() + beanSuff, FileStorage.class);
 		fs.deleteFile(path);
 	}
+	
+	/**
+	 * 获取文件访问路径(备用域名地址)
+	 * 
+	 * @param path 数据库保存的路径 如:upyun-1://student_photo/001.jpg,兼容老数据,路径必须是包含根路径的
+	 * @return 可直接访问的文件地址,如果没有配置备用地址,则返回主域名地址
+	 */
+	public static String realPathBackup(String path) {
+
+		if (StringUtils.isBlank(path)) {
+			throw new StatusException("6001", "文件路径是空");
+		}
+		// 兼容处理老数据文件路径
+		path = diposeOldPath(path);
+		// 如果是全路径直接返回
+		if (path.startsWith("http") || path.startsWith("https")) {
+			return path;
+		}
+		// 根据路径头获取对应的处理类
+		FileStorage fs = SpringContextHolder.getBean(getHead(path).toLowerCase() + beanSuff, FileStorage.class);
+		// 返回处理类处理结果
+		return fs.realPathBackup(path);
+
+	}
 }

+ 12 - 0
src/main/java/cn/com/qmth/examcloud/web/filestorage/impl/AliyunFileStorageImpl.java

@@ -19,6 +19,7 @@ import java.util.Map;
 
 import javax.activation.MimetypesFileTypeMap;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Service;
 
@@ -448,4 +449,15 @@ public class AliyunFileStorageImpl implements FileStorage {
 			throw new StatusException("6001", "上传出错", e);
 		}
 	}
+
+	@Override
+	public String realPathBackup(String path) {
+		String yunId = FileStorageUtil.getYunId(path);
+		AliYunAccount ac = AliyunSiteManager.getAliYunAccountByAliyunId(yunId);
+		String bk=ac.getDomainBackup();
+		if(StringUtils.isNotBlank(bk)) {
+			return FileStorageUtil.getUrl(bk, path);
+		}
+		return FileStorageUtil.getUrl(ac.getDomain(), path);
+	}
 }

+ 12 - 0
src/main/java/cn/com/qmth/examcloud/web/filestorage/impl/UpyunFileStorageImpl.java

@@ -3,6 +3,7 @@ package cn.com.qmth.examcloud.web.filestorage.impl;
 import java.io.File;
 import java.io.InputStream;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -101,4 +102,15 @@ public class UpyunFileStorageImpl implements FileStorage {
 		return pi;
 	}
 
+	@Override
+	public String realPathBackup(String path) {
+		String upyunId=FileStorageUtil.getYunId(path);
+		UpYunClient c=UpyunSiteManager.getUpYunClientByUpyunId(upyunId);
+		String bk=c.getDomainBackup();
+		if(StringUtils.isNotBlank(bk)) {
+			return FileStorageUtil.getUrl(bk, path);
+		}
+		return FileStorageUtil.getUrl(c.getDomain(), path);
+	}
+
 }

+ 6 - 3
src/main/java/cn/com/qmth/examcloud/web/upyun/UpYunClient.java

@@ -92,6 +92,8 @@ public class UpYunClient {
 	private static RequestConfig requestConfig;
 
 	private String domain;
+	
+	private String domainBackup;
 
 	static {
 		PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(60,
@@ -115,12 +117,13 @@ public class UpYunClient {
 	 * @param userName
 	 * @param password
 	 */
-	public UpYunClient(String bucketName, String userName, String password, String domain) {
+	public UpYunClient(String bucketName, String userName, String password, String domain,String domainBackup) {
 
 		this.bucketName = bucketName;
 		this.userName = userName;
 		this.password = password;
 		this.domain = domain;
+		this.domainBackup = domainBackup;
 		this.md5Password = MD5.encrypt32(password);
 	}
 
@@ -407,8 +410,8 @@ public class UpYunClient {
 		return domain;
 	}
 
-	public void setDomain(String domain) {
-		this.domain = domain;
+	public String getDomainBackup() {
+		return domainBackup;
 	}
 
 }

+ 3 - 2
src/main/java/cn/com/qmth/examcloud/web/upyun/UpyunSiteManager.java

@@ -54,6 +54,7 @@ public class UpyunSiteManager {
 			String userName = PropertyHolder.getString("$upyun.site." + upyunId + ".userName");
 			String password = PropertyHolder.getString("$upyun.site." + upyunId + ".password");
 			String domain = PropertyHolder.getString("$upyun.site." + upyunId + ".domain");
+			String domainBackup = PropertyHolder.getString("$upyun.site." + upyunId + ".domain.backup");
 
 			if (StringUtils.isBlank(bucketName)) {
 				throw new StatusException("520002",
@@ -68,11 +69,11 @@ public class UpyunSiteManager {
 						"password is not configured. upyunId=" + upyunId);
 			}
 			if (StringUtils.isBlank(domain)) {
-				throw new StatusException("520004", "domain is not configured. upyunId=" + upyunId);
+				throw new StatusException("520005", "domain is not configured. upyunId=" + upyunId);
 			}
 
 			if (null == CLIENT_HOLDERS.get(upyunId)) {
-				UpYunClient upYunClient = new UpYunClient(bucketName, userName, password, domain);
+				UpYunClient upYunClient = new UpYunClient(bucketName, userName, password, domain,domainBackup);
 				CLIENT_HOLDERS.put(upyunId, upYunClient);
 			}
 		}