package com.mossle.cdn; import java.io.File; import java.io.FileOutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; public class CdnUtils { private static Logger logger = LoggerFactory.getLogger(CdnUtils.class); // baseDir : mossle.store/cdn // spaceName : public // targetFileName : mossle.store/cdn/public/2017/03/24/uuid.jpg public static String copyUrlToFile(String baseDir, String url, String spaceName) throws Exception { String targetFileName = generateTargetFileName(url); return copyUrlToFile(baseDir, url, spaceName, targetFileName); } public static String copyUrlToFile(String baseDir, String url, String spaceName, String targetFileName) throws Exception { if (targetFileName == null) { return copyUrlToFile(baseDir, url, spaceName); } if (targetFileName.indexOf("../") != -1) { logger.info("invalid : {}", targetFileName); throw new IllegalStateException("invalid : " + targetFileName); } File file = findTargetFile(baseDir, spaceName, targetFileName); HttpURLConnection conn = (HttpURLConnection) new URL(url) .openConnection(); if (url.startsWith("https://")) { configHttps(conn); } FileOutputStream fos = new FileOutputStream(file); IOUtils.copy(conn.getInputStream(), fos); fos.flush(); fos.close(); return targetFileName; } public static String copyMultipartFileToFile(String baseDir, MultipartFile multipartFile, String spaceName) throws Exception { String targetFileName = generateTargetFileName(multipartFile .getOriginalFilename()); return copyMultipartFileToFile(baseDir, multipartFile, spaceName, targetFileName); } public static String copyMultipartFileToFile(String baseDir, MultipartFile multipartFile, String spaceName, String targetFileName) throws Exception { if (targetFileName == null) { return copyMultipartFileToFile(baseDir, multipartFile, spaceName); } if (targetFileName.indexOf("../") != -1) { logger.info("invalid : {}", targetFileName); throw new IllegalStateException("invalid : " + targetFileName); } File file = findTargetFile(baseDir, spaceName, targetFileName); multipartFile.transferTo(file); return targetFileName; } public static String generateTargetFileName(String originalName) { DateFormat dateFormat = new SimpleDateFormat("/yyyy/MM/dd/"); String targetFileName = dateFormat.format(new Date()) + UUID.randomUUID().toString() + findSuffix(originalName); return targetFileName; } public static File findTargetFile(String baseDir, String spaceName, String targetFileName) { File file = new File(baseDir + "/" + spaceName, targetFileName); if (file.exists()) { logger.info("file exists : {}, overwrite", file); } else if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } return file; } public static String findSuffix(String url) { String text = url.trim(); if (text.indexOf("?") != -1) { text = text.substring(0, text.indexOf("?")); } if (text.indexOf(".") == -1) { // no suffix return ""; } text = text.substring(text.lastIndexOf(".")); // suffix cannot contains un-normal char return text.trim().toLowerCase(); } public static void configHttps(HttpURLConnection conn) throws Exception { TrustManager[] tm = { new TrustAllX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); SSLSocketFactory ssf = sslContext.getSocketFactory(); // ssf.setHostnameVerifier(new TrustAllHostnameVerifier()); ((HttpsURLConnection) conn).setSSLSocketFactory(ssf); ((HttpsURLConnection) conn) .setHostnameVerifier(new TrustAllHostnameVerifier()); } }