上一篇博文实现了阿里云OSS Api版本简单的上传和下载功能,这篇文章介绍腾讯云COS Api版本的上传下载功能
官方文档:https://cloud.tencent.com/document/product/436/7751
工具类代码:
import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.HmacUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.*; public class CosWebApi { private static final String bucket = "test-12xxxxx"; private static final String SecretId = "xxxxx"; private static final String SecretKey = "xxxx"; private static final String host = ".cos.ap-chengdu.myqcloud.com";//根据自己购买的产品替换 //资源授权有效期(分钟) private static final int effectiveMinu = 10; public static final String LINE_SEPARATOR = " "; public static final String Q_SIGN_ALGORITHM_KEY = "q-sign-algorithm"; public static final String Q_SIGN_ALGORITHM_VALUE = "sha1"; public static final String Q_AK = "q-ak"; public static final String Q_SIGN_TIME = "q-sign-time"; public static final String Q_KEY_TIME = "q-key-time"; public static final String Q_HEADER_LIST = "q-header-list"; public static final String Q_URL_PARAM_LIST = "q-url-param-list"; public static final String Q_SIGNATURE = "q-signature"; public static final String GET = "get"; public static final String PUT = "put"; public static String getGMTDate(){ Calendar cd = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); return sdf.format(cd.getTime()); } public static String getAuthorization(Map<String, String> headers,Map<String, String> params,String httpMethod, String UriPathname) { Map<String, String> signHeaders = buildSignHeaders(headers); TreeMap<String, String> sortedSignHeaders = new TreeMap<>(); TreeMap<String, String> sortedParams = new TreeMap<>(); String qHeaderListStr = buildSignMemberStr(sortedSignHeaders); String qUrlParamListStr = buildSignMemberStr(sortedParams); sortedSignHeaders.putAll(signHeaders); sortedParams.putAll(params); String formatParameters = formatMapToStr(sortedParams); String formatHeaders = formatMapToStr(sortedSignHeaders); String formatStr = new StringBuilder().append(httpMethod).append(LINE_SEPARATOR) .append(UriPathname).append(LINE_SEPARATOR).append(formatParameters) .append(LINE_SEPARATOR).append(formatHeaders).append(LINE_SEPARATOR).toString(); //增加 Date expiredTime = new Date(System.currentTimeMillis() + effectiveMinu * 60 * 1000); String qKeyTimeStr, qSignTimeStr; qKeyTimeStr = qSignTimeStr = buildTimeStr(expiredTime); String hashFormatStr = DigestUtils.sha1Hex(formatStr); String stringToSign = new StringBuilder().append(Q_SIGN_ALGORITHM_VALUE) .append(LINE_SEPARATOR).append(qSignTimeStr).append(LINE_SEPARATOR) .append(hashFormatStr).append(LINE_SEPARATOR).toString(); String signKey = HmacUtils.hmacSha1Hex(SecretKey, qKeyTimeStr); String signature = HmacUtils.hmacSha1Hex(signKey, stringToSign); String authoriationStr = new StringBuilder().append(Q_SIGN_ALGORITHM_KEY).append("=") .append(Q_SIGN_ALGORITHM_VALUE).append("&").append(Q_AK).append("=") .append(SecretId).append("&").append(Q_SIGN_TIME).append("=") .append(qSignTimeStr).append("&").append(Q_KEY_TIME).append("=").append(qKeyTimeStr) .append("&").append(Q_HEADER_LIST).append("=").append(qHeaderListStr).append("&") .append(Q_URL_PARAM_LIST).append("=").append(qUrlParamListStr).append("&") .append(Q_SIGNATURE).append("=").append(signature).toString(); return authoriationStr; } //http get请求 public static String get(String url,Map<String,String> head)throws IOException { HttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); for(String key : head.keySet()){ httpGet.setHeader(key,head.get(key)); } HttpResponse response = client.execute(httpGet); response.getEntity().getContent(); HttpEntity entity = response.getEntity(); return EntityUtils.toString(entity, "utf-8"); } public static String buildTimeStr(Date expiredTime) { StringBuilder strBuilder = new StringBuilder(); long startTime = System.currentTimeMillis() / 1000; long endTime = expiredTime.getTime() / 1000; strBuilder.append(startTime).append(";").append(endTime); return strBuilder.toString(); } public static String formatMapToStr(Map<String, String> kVMap) { StringBuilder strBuilder = new StringBuilder(); boolean seeOne = false; for (String key : kVMap.keySet()) { String lowerKey = key.toLowerCase(); String encodeKey = encode(lowerKey); String encodedValue = ""; if (kVMap.get(key) != null) { encodedValue = encode(kVMap.get(key)); } if (!seeOne) { seeOne = true; } else { strBuilder.append("&"); } strBuilder.append(encodeKey).append("=").append(encodedValue); } return strBuilder.toString(); } private static Map<String, String> buildSignHeaders(Map<String, String> originHeaders) { Map<String, String> signHeaders = new HashMap<>(); for (String key : originHeaders.keySet()) { if (key.equalsIgnoreCase("content-type") || key.equalsIgnoreCase("content-length") || key.equalsIgnoreCase("content-md5") || key.startsWith("x") || key.startsWith("X")) { String lowerKey = key.toLowerCase(); String value = originHeaders.get(key); signHeaders.put(lowerKey, value); } } return signHeaders; } public static String buildSignMemberStr(Map<String, String> signHeaders) { StringBuilder strBuilder = new StringBuilder(); boolean seenOne = false; for (String key : signHeaders.keySet()) { if (!seenOne) { seenOne = true; } else { strBuilder.append(";"); } strBuilder.append(key.toLowerCase()); } return strBuilder.toString(); } public static String encode(String originUrl) { try { return URLEncoder.encode(originUrl, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~"); } catch (UnsupportedEncodingException var2) { return null; } } public static String getObj(String key) { String gmtDate = getGMTDate(); Map<String, String> headers = new HashMap<>(); headers.put("Host",bucket + host); headers.put("Date",gmtDate); Map<String, String> params = new HashMap<>(); String authorization = getAuthorization(headers, params, GET, key); Map<String, String> httpHeader = new HashMap<>(); httpHeader.put("Host",bucket + host); httpHeader.put("Date",gmtDate); httpHeader.put("Authorization",authorization); try { return get("https://" + bucket + host + key, httpHeader); } catch (IOException ex) { ex.printStackTrace(); } return null; } //////////////////////////////////////////////////////////////////// public static String shaEncode(String inStr) throws Exception { MessageDigest sha = null; try { sha = MessageDigest.getInstance("SHA"); } catch (Exception e) { e.printStackTrace(); return ""; } byte[] byteArray = inStr.getBytes("UTF-8"); byte[] md5Bytes = sha.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff; if (val < 16) { hexValue.append("0"); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } public static String getSecondTimestamp(Date date){ if (null == date) { return ""; } String timestamp = String.valueOf(date.getTime()); int length = timestamp.length(); if (length > 3) { return timestamp.substring(0,length-3); } else { return ""; } } public static String genHMAC(String key,String src) { try { SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("utf-8"), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); byte[] rawHmac = mac.doFinal(src.getBytes("utf-8")); return Hex.encodeHexString(rawHmac); } catch (Exception e) { throw new RuntimeException(e); } } public static void getUploadInformation(String path,String obj) throws IOException, Exception { //创建连接 URL url = new URL(path); HttpURLConnection connection ; StringBuffer sbuffer=null; try { //添加 请求内容 connection= (HttpURLConnection) url.openConnection(); //设置http连接属性 connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("PUT"); connection.setRequestProperty("Content-Length", obj.toString().getBytes().length + ""); connection.setReadTimeout(10000);//设置读取超时时间 connection.setConnectTimeout(10000);//设置连接超时时间 connection.connect(); OutputStream out = connection.getOutputStream(); out.write(obj.toString().getBytes()); out.flush(); out.close(); //读取响应 if (connection.getResponseCode()==200) { // 从服务器获得一个输入流 InputStreamReader inputStream =new InputStreamReader(connection.getInputStream()); BufferedReader reader = new BufferedReader(inputStream); String lines; sbuffer= new StringBuffer(""); while ((lines = reader.readLine()) != null) { lines = new String(lines.getBytes(), "utf-8"); sbuffer.append(lines); } reader.close(); }else{ } //断开连接 connection.disconnect(); } catch (IOException e) { e.printStackTrace(); } } public static String putObj(String key,String content) { try { Date date_s = new Date(); Date date_e = new Date(); date_e.setTime(date_s.getTime() + effectiveMinu * 60 * 1000); String q_sign_algorithm = "sha1"; String q_sign_time =getSecondTimestamp(date_s)+";"+getSecondTimestamp(date_e); String q_key_time = getSecondTimestamp(date_s)+";"+getSecondTimestamp(date_e); String SignKey = genHMAC(SecretKey, q_key_time); String HttpString = PUT + " " + key + " "; String StringToSign = q_sign_algorithm + " " + q_sign_time + " " + shaEncode(HttpString) + " "; String Signature = genHMAC(SignKey, StringToSign); String url = "https://" + bucket + host + key + "?q-sign-algorithm=" + q_sign_algorithm + "&q-ak=" + SecretId + "&q-sign-time=" + q_sign_time + "&q-key-time=" + q_key_time + "&q-header-list=&q-url-param-list=&q-signature=" + Signature; getUploadInformation(url, content); return key; } catch (Exception ex) { System.out.println("上传失败:" + ex.getMessage()); return null; } } //调用示例 public static void main(String[] args) { String putResult = putObj("/test/2333333.txt", "test content"); System.out.println("putResult:" + putResult); String getResult = getObj(putResult); System.out.println("getResult:" + getResult); } }
引入jar包
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.1</version> </dependency>