背景

因为在项目中需要使用阿里云的视频点播服务,需要获取视频点播的时长信息。

工具类

生成签名串Signature

SignatureUtils.java


package com.meeno.wzq.alibaba.signature; import com.google.common.collect.Maps;
import com.meeno.framework.util.HttpUtils;
import lombok.extern.java.Log;
import sun.misc.BASE64Encoder; import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.*; /**
* @description: 生成签名串Signature
* @author: Wzq
* @create: 2020-01-14 17:38
*/
@Log
public class SignatureUtils { /*对所有参数名称和参数值做URL编码*/
public static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) {
List<String> encodeParams = new ArrayList<String>();
if (publicParams != null) {
for (String key : publicParams.keySet()) {
String value = publicParams.get(key);
//将参数和值都urlEncode一下。
String encodeKey = percentEncode(key);
String encodeVal = percentEncode(value);
encodeParams.add(encodeKey + "=" + encodeVal);
}
}
if (privateParams != null) {
for (String key : privateParams.keySet()) {
String value = privateParams.get(key);
//将参数和值都urlEncode一下。
String encodeKey = percentEncode(key);
String encodeVal = percentEncode(value);
encodeParams.add(encodeKey + "=" + encodeVal);
}
}
return encodeParams;
}
/*获取 CanonicalizedQueryString*/
public static String getCQS(List<String> allParams) {
ParamsComparator paramsComparator = new ParamsComparator();
Collections.sort(allParams, paramsComparator);
String cqString = "";
for (int i = 0; i < allParams.size(); i++) {
cqString += allParams.get(i);
if (i != allParams.size() - 1) {
cqString += "&";
}
}
return cqString;
}
/*字符串参数比较器,按字母序升序*/
public static class ParamsComparator implements Comparator<String> {
@Override
public int compare(String lhs, String rhs) {
return lhs.compareTo(rhs);
}
} public static byte[] hmacSHA1Signature(String accessKeySecret, String stringToSign) {
try {
String key = accessKeySecret + "&";
try {
SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signKey);
return mac.doFinal(stringToSign.getBytes());
} catch (Exception e) {
throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
}
} catch (SignatureException e) {
e.printStackTrace();
}
return null;
} public static String newStringByBase64(byte[] bytes)
throws UnsupportedEncodingException {
if (bytes == null || bytes.length == 0) {
return null;
}
return new String(new BASE64Encoder().encode(bytes));
} /*特殊字符替换为转义字符*/
public static String percentEncode(String value) {
try {
String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8");
String plusReplaced = urlEncodeOrignStr.replace("+", "%20");
String starReplaced = plusReplaced.replace("*", "%2A");
String waveReplaced = starReplaced.replace("%7E", "~");
return waveReplaced;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
} /*生成当前UTC时间戳Time*/
public static String generateTimestamp() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
df.setTimeZone(new SimpleTimeZone(0, "GMT"));
return df.format(date);
} /*生成随机数SignatureNonce*/
public static String generateRandom() {
String signatureNonce = UUID.randomUUID().toString();
return signatureNonce;
} }

httpUtils.java

请求工具类

package com.meeno.framework.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.meeno.encryptionmodule.testPaper.service.TestpaperServiceImpl;
import com.meeno.wzq.config.PlatformServerConfig;
import com.meeno.wzq.constants.EncryptionConstants;
import com.meeno.wzq.constants.PlatformUrlEnum;
import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HttpContext; import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.*; /**
* @Auther: Wzq
* @Date: 2019/4/2 11:20
* @Description: 得不到的永远在骚动,被偏爱的都有恃无恐。 -- HttpUtils
*/
public class HttpUtils { private final static PoolingHttpClientConnectionManager poolConnManager = new PoolingHttpClientConnectionManager(); //连接池管理器
private final static HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() { //retry handler
public boolean retryRequest(IOException exception,
int executionCount, HttpContext context) {
if (executionCount >= 5) {
return false;
}
if (exception instanceof NoHttpResponseException) {
return true;
}
if (exception instanceof InterruptedIOException) {
return false;
}
if (exception instanceof UnknownHostException) {
return false;
}
if (exception instanceof ConnectTimeoutException) {
return false;
}
HttpClientContext clientContext = HttpClientContext
.adapt(context);
HttpRequest request = clientContext.getRequest(); if (!(request instanceof HttpEntityEnclosingRequest)) {
return true;
}
return false;
}
}; static { //类加载的时候 设置最大连接数 和 每个路由的最大连接数
poolConnManager.setMaxTotal(200000);
poolConnManager.setDefaultMaxPerRoute(100000);
}
/**
* ########################### core code#######################
* @return
*/
private static CloseableHttpClient getCloseableHttpClient() {
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(poolConnManager)
.setRetryHandler(httpRequestRetryHandler)
.build(); return httpClient;
} /**
* 封装HTTP GET方法
* 有参数的Get请求
* @param
* @param
* @return
* @throws ClientProtocolException
* @throws java.io.IOException
*/
public static String getAjax(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {
HttpClient httpClient = getCloseableHttpClient();
HttpGet httpGet = new HttpGet();
List<NameValuePair> formparams = setHttpParams(paramMap);
String param = URLEncodedUtils.format(formparams, "UTF-8");
httpGet.setURI(URI.create(url + "?" + param));
HttpResponse response = httpClient.execute(httpGet);
String httpEntityContent = getHttpEntityContent(response);
httpGet.abort();
return httpEntityContent;
} /**
* 封装HTTP GET方法
* 有参数的Get请求
* @param
* @param
* @return
* @throws ClientProtocolException
* @throws java.io.IOException
*/
public static String get(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {
paramMap = getParamsData(paramMap);
HttpClient httpClient = getCloseableHttpClient();
HttpGet httpGet = new HttpGet();
List<NameValuePair> formparams = setHttpParams(paramMap);
String param = URLEncodedUtils.format(formparams, "UTF-8");
httpGet.setURI(URI.create(url + "?" + param));
HttpResponse response = httpClient.execute(httpGet);
String httpEntityContent = getHttpEntityContent(response);
httpGet.abort();
return httpEntityContent;
} /**
* 封装HTTP GET方法
* 无参数的Get请求
* @param
* @return
* @throws ClientProtocolException
* @throws java.io.IOException
*/
public static String get(String url) throws ClientProtocolException, IOException {
//首先需要先创建一个DefaultHttpClient的实例
HttpClient httpClient = new DefaultHttpClient();
//先创建一个HttpGet对象,传入目标的网络地址,然后调用HttpClient的execute()方法即可:
HttpGet httpGet = new HttpGet();
httpGet.setURI(URI.create(url));
HttpResponse response = httpClient.execute(httpGet);
String httpEntityContent = getHttpEntityContent(response);
httpGet.abort();
return httpEntityContent;
}
/**
* 获得响应HTTP实体内容
* @param response
* @return
* @throws java.io.IOException
* @throws java.io.UnsupportedEncodingException
*/
private static String getHttpEntityContent(HttpResponse response) throws IOException, UnsupportedEncodingException {
//通过HttpResponse 的getEntity()方法获取返回信息
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream is = entity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line = br.readLine();
StringBuilder sb = new StringBuilder();
while (line != null) {
sb.append(line + "\n");
line = br.readLine();
}
br.close();
is.close();
return sb.toString();
}
return "";
} /**
* 封装支付HTTP POST方法
* @param
* @param
* @return
* @throws ClientProtocolException
* @throws java.io.IOException
*/
public static String postPayMsg(String url, Map<String, String> paramMap) throws ClientProtocolException, IOException {
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
HttpPost httpPost = new HttpPost(url);
paramMap = getParamsData(paramMap);
List<NameValuePair> formparams = setHttpParams(paramMap);
UrlEncodedFormEntity param = new UrlEncodedFormEntity(formparams, "UTF-8");
//通过setEntity()设置参数给post
httpPost.setEntity(param);
//利用httpClient的execute()方法发送请求并且获取返回参数
HttpResponse response = httpClient.execute(httpPost);
String httpEntityContent = getHttpEntityContent(response);
httpPost.abort();
return httpEntityContent;
} /**
* 设置请求参数
* @param
* @return
*/
private static List<NameValuePair> setHttpParams(Map<String, String> paramMap) {
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
Set<Map.Entry<String, String>> set = paramMap.entrySet();
for (Map.Entry<String, String> entry : set) {
formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
return formparams;
} public static Map<String,String> getParamsData(Map<String,String> paramsMap){
Map<String,String> params = new HashMap<>();
String dataJson = JSONObject.toJSONString(paramsMap);
params.put("Data",dataJson); return params;
} /**
* @描述: 获取http请求的JSONObject
* @参数: [jsonStr]
* @返回值: com.alibaba.fastjson.JSONObject
* @创建人 WZQ
* @创建时间: 11:38 2019/4/2
*/
public static JSONObject getResponseJson(String jsonStr){
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
return jsonObject;
} /**
* @描述: 获取新增返回的data id
* @参数: [jsonStr]
* @返回值: java.lang.Long
* @创建人 WZQ
* @创建时间: 11:38 2019/4/2
*/
public static Long getResponseData(String jsonStr){
return JSONObject.parseObject(jsonStr).getLong("data");
} /**
* @描述: 执行获取Id
* @参数: [url, paramsMap]
* @返回值: java.lang.Long
* @创建人 WZQ
* @创建时间: 17:24 2019/4/2
*/
/* public static Long executeHttpGetId(String url,Map<String,String> paramsMap){
// JSONObject jsonObject = executeHttp(url,paramsMap);
System.out.println(url);
String getStr = null;
try {
getStr = get(url,paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
return JSONObject.parseObject(getStr).getLong("data");
}*/ /**
* @描述: 执行返回JSONArr
* @参数: [utl, paramsMap]
* @返回值: java.lang.String
* @创建人 WZQ
* @创建时间: 17:17 2019/4/2
*/
public static JSONArray executeHttpGetResultArr(String url, Map<String,String> paramsMap){
System.out.println(url);
String getStr = null;
try {
getStr = get(url,paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
return JSONObject.parseObject(getStr).getJSONArray("data");
} public static JSONArray executeHttpGetResultArr(PlatformUrlEnum url, Map<String,String> paramsMap){
System.out.println(url);
String getStr = null;
try {
getStr = postPayMsg(PlatformServerConfig.baseUrl+url.getUrl(),paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
return JSONObject.parseObject(getStr).getJSONArray("data");
} public static void executeHttpNoReturn(String url,Map<String,String> paramsMap){
System.out.println(url);
String getStr = null;
try {
getStr = get(url,paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
//JSONObject jsonObject = JSONObject.parseObject(getStr);
} /**
* @描述: 执行返回JSON
* @参数: [utl, paramsMap]
* @返回值: java.lang.String
* @创建人 WZQ
* @创建时间: 17:17 2019/4/2
*/
public static JSONObject executeHttpGetResult(String url,Map<String,String> paramsMap){
System.out.println(url);
String getStr = null;
try {
getStr = get(url,paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(getStr);
return jsonObject.getJSONObject("data");
} public static JSONObject executeHttpGetResult(PlatformUrlEnum url, Map<String,String> paramsMap){
System.out.println(url);
String getStr = null;
try {
getStr = get(PlatformServerConfig.baseUrl+url.getUrl(),paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
return JSONObject.parseObject(getStr).getJSONObject("data");
} /**
* @描述:
* @参数: [url, paramsMap]
* @返回值: com.alibaba.fastjson.JSONObject
* @创建人 WZQ
* @创建时间: 15:44 2019/4/8
*/
/* public static JSONObject execute(String url,Map<String,String> paramsMap){
System.out.println(url);
String getStr = null;
try {
getStr = get(url,paramsMap);
} catch (IOException e) {
e.printStackTrace();
}
return JSONObject.parseObject(getStr);
}
*/ /**
* @描述: 执行获取Id
* @参数: [url, paramsMap]
* @返回值: java.lang.Long
* @创建人 WZQ
* @创建时间: 17:24 2019/4/2
*/
public static Long executeHttpGetId(String url,Map<String,String> paramsMap){
Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);
Method method = (Method) tempMap.get("method");
Object obj = tempMap.get("object");
List params = Lists.newArrayList(); for(String key : paramsMap.keySet()){
String value = paramsMap.get(key);
if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){
Long tempVal = Long.valueOf(value);
params.add(tempVal);
}else{
if("null".equals(value)){
params.add(null);
}else{
params.add(value);
}
}
}
Object object = null;
try {
/*LocalVariableTableParameterNameDiscoverer u =
new LocalVariableTableParameterNameDiscoverer();
String[] params1 = u.getParameterNames(method);
String name = method.getParameters()[0].getName();*/
object = method.invoke(obj,params.toArray());
} catch (Exception e) {
e.printStackTrace();
MeenoAssert.notTrue(true,"加密数据发生错误!");
} return ((JSONObject)object).getLong("id");
} /**
* @描述: 执行返回JSON
* @参数: [utl, paramsMap]
* @返回值: java.lang.String
* @创建人 WZQ
* @创建时间: 17:17 2019/4/2
*/
public static JSONObject executeHttp(String url,Map<String,String> paramsMap){
Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);
Method method = (Method) tempMap.get("method");
Object obj = tempMap.get("object");
List params = Lists.newArrayList(); for(String key : paramsMap.keySet()){
String value = paramsMap.get(key);
if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){
Long tempVal = Long.valueOf(value);
params.add(tempVal);
}else{
if("null".equals(value)){
params.add(null);
}else{
params.add(value);
}
}
}
Object object = null;
try {
object = method.invoke(obj,params.toArray());
} catch (Exception e) {
e.printStackTrace();
MeenoAssert.notTrue(true,"加密数据发生错误!");
} return ((JSONObject)object);
} /**
* @描述:
* @参数: [url, paramsMap]
* @返回值: com.alibaba.fastjson.JSONObject
* @创建人 WZQ
* @创建时间: 15:44 2019/4/8
*/
public static JSONObject execute(String url,Map<String,String> paramsMap){
Map<String,Object> tempMap = EncryptionConstants.encryptionConstantsMap.get(url);
Method method = (Method) tempMap.get("method");
Object obj = tempMap.get("object");
List params = Lists.newArrayList(); for(String key : paramsMap.keySet()){
String value = paramsMap.get(key);
if(value!=null&&(key.toLowerCase().equals("id")||key.toLowerCase().equals("indexid"))){
Long tempVal = Long.valueOf(value);
params.add(tempVal);
}else{
if("null".equals(value)){
params.add(null);
}else{
params.add(value);
}
}
}
Object object = null;
try {
object = method.invoke(obj,params.toArray());
} catch (Exception e) {
e.printStackTrace();
MeenoAssert.notTrue(true,"加密数据发生错误!");
} return ((JSONObject)object);
} }

VideoUtils.java

videoUtils获取视频信息工具类


package com.meeno.wzq.alibaba.video; import com.google.common.collect.Maps;
import com.meeno.framework.util.HttpUtils;
import com.meeno.wzq.alibaba.signature.SignatureUtils; import java.io.IOException;
import java.util.List;
import java.util.Map; /**
* @description: videoUtils获取视频信息工具类
* @author: Wzq
* @create: 2020-01-14 19:31
*/
public class VideoUtils { /**
*@Description 获取签名结果
*@Param [accessKeyId, accessKeySecret, videoId]
*@Return java.lang.String
*@Author Wzq
*@Date 2020/1/14
*@Time 19:30
*/
public static String getVideoInfo(String accessKeyId,String accessKeySecret,String videoId) throws IOException {
String timestamp = SignatureUtils.generateTimestamp();
String signatureNonce = SignatureUtils.generateRandom();
//1.1. 构造规范化的请求字符串
Map<String, String> privateParams = Maps.newLinkedHashMap();
privateParams.put("Action","GetVideoInfo");
privateParams.put("VideoId", videoId);
Map<String, String> publicParams = Maps.newLinkedHashMap();
publicParams.put("Timestamp",timestamp);
publicParams.put("Format","JSON");
publicParams.put("AccessKeyId",accessKeyId);
publicParams.put("SignatureMethod", "HMAC-SHA1");
publicParams.put("SignatureNonce",signatureNonce);
publicParams.put("Version", "2017-03-21");
publicParams.put("SignatureVersion","1.0"); List<String> allParams = SignatureUtils.getAllParams(publicParams, privateParams); String canonicalizedQueryString = SignatureUtils.getCQS(allParams); //1.2. 构造待签名的字符串
/*构造待签名的字符串*/
String StringToSign = "GET" + "&" + SignatureUtils.percentEncode("/") + "&" + SignatureUtils.percentEncode(canonicalizedQueryString); //1.3. 计算待签名字符串的HMAC值
byte[] bytes = SignatureUtils.hmacSHA1Signature(accessKeySecret, StringToSign); //1.4. 编码得到最终签名值
//按照 Base64 编码规则将1.3中计算得到的HMAC值编码成字符串,得到最终签名值(Signature)。
String signature = SignatureUtils.newStringByBase64(bytes);
// log.info("-------------"+signature);
Map<String,String> videoInfoMap = Maps.newLinkedHashMap();
videoInfoMap.put("Action","GetVideoInfo");
videoInfoMap.put("VideoId", videoId);
videoInfoMap.put("Format","JSON");
videoInfoMap.put("AccessKeyId",accessKeyId);
videoInfoMap.put("Signature",signature);
videoInfoMap.put("SignatureMethod","HMAC-SHA1");
videoInfoMap.put("SignatureVersion","1.0");
videoInfoMap.put("SignatureNonce",signatureNonce);
videoInfoMap.put("Timestamp", timestamp);
videoInfoMap.put("Version","2017-03-21");
//调用http get请求
String resultStr = HttpUtils.getAjax("http://vod.cn-shanghai.aliyuncs.com", videoInfoMap);
// log.info(s);
return resultStr;
} }

调用获取视频点播工具类获取videoinfo

controller层代码如下:



    /**
*@Description 获取视频点播的视频信息
*@Param [session, request, response, data]
*@Return void
*@Author Wzq
*@Date 2020/1/14
*@Time 19:34
*/
@RequestMapping(value = "getVideoInfo.action")
public void getVideoInfo(final HttpSession session,
final HttpServletRequest request,
final HttpServletResponse response,
@RequestParam(value = "Data") String data) throws IOException { JSONObject jsonObject = JSONObject.parseObject(data);
//视频点播videoId
String videoId = jsonObject.getString("videoId");
Bank indexBank = this.enterpriseDao.getEnterprise().getIndexBank();
String accessKeyId = "";
String accessKeySecret = "";
String videoInfo = VideoUtils.getVideoInfo(accessKeyId, accessKeySecret, videoId);
JSONObject resultJson = null;
if(videoInfo != null && !videoInfo.isEmpty()){
resultJson = JSONObject.parseObject(videoInfo);
}
CommonUtil.toJson(response, new ResponseBean(Constant.RESPONSE_SUCCESS,"",resultJson));
}

阿里云视频点播获取视频点播的video信息的更多相关文章

  1. 阿里云自动获取token值(python)

    一,token说明 token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识.当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个 ...

  2. 阿里云OSS 获取目录下所有文件

    public class AliyunHandle { public static string accessKeyId = "a1uI5xxxxxxxxxrP4H"; publi ...

  3. 阿里云视频点播 php开发

    先购买开通阿里云的<视频点播>服务,视频点播 可以购买套餐 ,我在项目中使用的是299套餐 开发前在<用户信息管理>生成Access Key Secret,开发密钥使用 阿里云 ...

  4. ThinkPHP 文件上传到阿里云OSS上(干货)

    参考:http://www.thinkphp.cn/extend/789.html 1.前往阿里云github下载SDK包:https://github.com/aliyun/aliyun-oss-p ...

  5. Java项目接入阿里云OSS存储

    需求背景 目前公司内部项目所支持的文件云存储方式还是公司内部项目组提供的方案,但在时间的考验之下,弊端显现,尤其是灾备切换过程中需要切换访问地址,这种操作不方便,更可能因为中间过程的失误导致资源不可用 ...

  6. 阿里云人脸比对API封装

    这是根据封装是根据阿里云官方给的Demo进行修改的,当时是因为编写微信小程序云函数需要使用到阿里云人脸比对接口,才对其进行封装的. 记录下来,方便下次使用. 复制下来可以直接使用. 用到的依赖如下: ...

  7. 阿里云语音合成(汉语英语)带UI界面的小程序(python)

    一,项目说明 将汉文转汉语.英文转英语,同时又有逗号<###English###>,<,,,>和句号<...>标志符用于文件处理.其中英文包含在### 英文 ### ...

  8. 阿里云DataWorks实践:数据集成+数据开发

    简介 什么是DataWorks: DataWorks(数据工场,原大数据开发套件)是阿里云重要的PaaS(Platform-as-a-Service)平台产品,为您提供数据集成.数据开发.数据地图.数 ...

  9. Thinkphp整合阿里云OSS图片上传实例

    Thinkphp3.2整合阿里云OSS图片上传实例,图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了 首先引入阿里云OSS类库 < ...

随机推荐

  1. 《OpenResty 最佳实践》学习开篇

    前言:对openresty学习中,收集了一些相关知识的参考网站,有兴趣的可以看看.另附网盘分享. lua菜鸟教程 openresty最佳实战 lua在线解析工具 Nginx Lua API Nginx ...

  2. 一、k8s介绍(第一章、k8s高可用集群安装)

    作者:北京小远 出处:http://www.cnblogs.com/bj-xy/ 参考课程:Kubernetes全栈架构师(电脑端购买优惠) 文档禁止转载,转载需标明出处,否则保留追究法律责任的权利! ...

  3. matlab——插值与拟合

    @ 目录 前言 一.拟合 1.定义 2.三种判别准则 3.最小二乘法 (1)一般形式 (2)常用函数 (3)matlab实现 二.插值 1.定义 2.方法 (1)分段线性插值 (2)拉格朗日插值多项式 ...

  4. 【012】JavaSE面试题(十二):多线程(2)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...

  5. 计算机毕业设计选题大合集,含ssm,springboot,小程序,php,python

    1基于springboot医院急诊系统 2基于springboot校园闲置物品租售系统 3基于springboot校园闲置物品交易网站 4基于springboot图书网站 5基于springboot外 ...

  6. 基于IDEA的JAVA开发[第一集]:在Linux上安装IDEA

    1,因为买了荣耀的magicbook pro 锐龙版,系统是Linux,以后打算直接在Linux上开发.本来熟悉Myeclipse,下载了Myeclipse2017 for Linux,但是安装中出现 ...

  7. [JS]闭包和词法环境

    词法环境 词法环境(lexical environment)由两个部分组成: 环境记录--一个存储所有局部变量作为其属性的对象. 对外部词法环境的引用,与外部代码相关联. 全局词法环境在脚本执行前创建 ...

  8. 2个Double字符串进行

    public static int compare(double d1, double d2) { if (d1 < d2) return -1; // Neither val is NaN, ...

  9. C++五十一篇 -- VS2017开发人员新闻无法联网

    参考链接:https://blog.csdn.net/zz1589275782/article/details/88364983 这几天玩了下以前的电脑,本来想更新一下Visual Studio In ...

  10. 【Maven实战技巧】「插件使用专题」Maven-Assembly插件实现自定义打包

    前提概要 最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembly插件完美的实现了该需求,爽爆了有 ...