背景

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

工具类

生成签名串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. c语言格式字符

    格式说明由"%"和格式字符组成,如%d%f等.它的作用是将输出的数据转换为指定的格式输出.格式说明总是由"%"字符开始的. 格式字符有d,o,x,u,c,s,f ...

  2. C语言:整数取值范转及溢出

    short.int.long 是C语言中常用的三种整数类型,分别称为短整型.整型.长整型.在现代操作系统中,short.int.long 的长度分别是 2.4.4 或者 8,它们只能存储有限的数值,当 ...

  3. C预处理跨平台

    #include <stdio.h> //不同的平台下引入不同的头文件 #if _WIN32 //识别windows平台 #include <windows.h> #elif ...

  4. asp.net 简明代码

    <asp:RadioButton ID="daadaa" runat="server" GroupName="dada" OnChec ...

  5. java面向对象程序设计(下)-接口的定义

    抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更加彻底,则可以提炼出一种更加特殊的"抽象类"-接口(interface),Java9对接口进行了改进,允许在接口中定义默认方 ...

  6. C#/.NET/.NET Core学习视频汇总(持续更新ing)

    前言: 之前有很多小伙伴在我的公众号后台留言问有没有C#/.NET/.NET Core这方面相关的视频推荐,我一般都会推荐他们去B站搜索一下.今天刚好有空收集了网上一些比较好的C#/.NET/.NET ...

  7. 一次搞懂JavaScript对象

    索引 目录 索引 1. 对象与类 2.对象使用 2.1 语法 2.2 属性 3.对象特性 4.对象的创建 4.1 字面量 4.2 工厂函数 4.3 构造函数 4.4 class类 4.5 对象与单例模 ...

  8. java跨平台性说明

    一.举例说明 我们知道,只要是用标准C开发的程序,使用不同的编译器编译后的可执行文件是可以在对应平台运行的,比如windows可以使用VC编译,那编译后的exe文件就可以在windows下运行:liu ...

  9. English Study!

    As you konw, education is a top priority for us !  When the times abandon you, they don't even call ...

  10. Idea快捷键 累积大全

    分类 Editing 这个 Searching/Replcae Navigation Atl +1                                           打开和关闭左侧p ...