using Aliyun.OSS; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using System.Web; namespace WX.CRM.Common { public class AliyunHelper { #region 阿里云图片上传 /// /// 设置上传的文件的key值 /// /// /// public static string UploadImage(string path, string imgKey) { #region //iLCVNfsiH4F1JLNU //24DOemjGGeQeG2WJNzHBqi1wNtySgB //http://qp-wechat-img.oss-cn-shenzhen.aliyuncs.com //qp-wechat-img string aliAccessKeyId = Utility.GetSettingByKey("AliAccessKeyId") ?? "iLCVNfsiH4F1JLNU"; string aliAccessKeySecret = Utility.GetSettingByKey("AliAccessKeySecret") ?? "24DOemjGGeQeG2WJNzHBqi1wNtySgB"; string aliBucketHost = Utility.GetSettingByKey("AliBucketHost") ?? "http://qp-wechat-img.oss-cn-shenzhen.aliyuncs.com"; string aliBucket = Utility.GetSettingByKey("AliBucket") ?? "qp-wechat-img"; #endregion if (string.IsNullOrEmpty(aliAccessKeyId) || string.IsNullOrEmpty(aliAccessKeySecret) || string.IsNullOrEmpty(aliBucketHost) || string.IsNullOrEmpty(aliBucket)) { throw new Exception("阿里oss配置错误"); } var ossClient = new OssClient(aliBucketHost, aliAccessKeyId, aliAccessKeySecret); try { var result = ossClient.PutObject(aliBucket, imgKey, path); return aliBucketHost + "/" + imgKey; } catch (Exception es) { LogHelper.Error(string.Format("Put object failed, {0}", es.Message)); } return null; } #endregion public static string UploadImage(string path) { if (string.IsNullOrWhiteSpace(path)) { throw new Exception("路径不能为空!"); } try { var md5 = Utility.GetMD5HashFromFile(path); return UploadImage(path, md5); } catch { throw; } } } public class AliHelper { private string AccessKeyId = ""; //密钥ID private string AccessKeySecret = ""; private string Format = "JSON"; //返回值的类型 private string Version = ""; //API版本号 private string Signature = ""; //签名结果串 private string SignatureMethod = "HMAC-SHA1"; //签名方式,目前支持HMAC-SHA1 private string Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ"); //请求的时间戳 日期格式按照ISO8601标准表示,并需要使用UTC时间 yyyy-MM-ddTHH:mm:ssZ; private string SignatureVersion = "1.0"; //签名算法版本 private string SignatureNonce = Guid.NewGuid().ToString(); //唯一随机数,用于防止网络重放攻击。用户在不同请求间要使用不同的随机数值 public AliHelper(string AccessKeyId, string AccessKeySecret, string Version) { this.AccessKeyId = AccessKeyId; this.AccessKeySecret = AccessKeySecret; this.Version = Version; } /// /// 计算签名 /// /// private void ComputeSignature(Dictionary ditParam, string method = "GET") { BuildParameters(ditParam); //按ascii码排序 Dictionary asciiDit = new Dictionary(); string[] KeyArr = ditParam.Keys.ToArray(); Array.Sort(KeyArr, string.CompareOrdinal); foreach (var key in KeyArr) { string value = ditParam[key].ToString(); asciiDit.Add(key, value); } //计算签名 var canonicalizedQueryString = string.Join("&", asciiDit.Select(x => PercentEncode(x.Key) + "=" + PercentEncode(x.Value.ToString()))); var stringToSign = method.ToString().ToUpper() + "&" + PercentEncode("/") + "&" + PercentEncode(canonicalizedQueryString); var keyBytes = Encoding.UTF8.GetBytes(AccessKeySecret + "&"); var hmac = new HMACSHA1(keyBytes); var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)); Signature = Convert.ToBase64String(hashBytes); ditParam.Add("Signature", Signature); } //获取公共参数和相关方法中的参数 private void BuildParameters(Dictionary ditParam) { ditParam.Add("Format", Format.ToUpper()); ditParam.Add("Version", Version); ditParam.Add("AccessKeyId", AccessKeyId); ditParam.Add("Timestamp", Timestamp); ditParam.Add("SignatureMethod", SignatureMethod); ditParam.Add("SignatureVersion", SignatureVersion); ditParam.Add("SignatureNonce", SignatureNonce); } private string PercentEncode(string value) { return UpperCaseUrlEncode(value) .Replace("/", "%2F") .Replace("+", "%20") .Replace("*", "%2A") .Replace("%7E", "~") .Replace("!", "%21") .Replace("'", "%27") .Replace("(", "%28") .Replace(")", "%29"); } private string UpperCaseUrlEncode(string s) { // C# 的 HttpUtility.UrlEncode() 编码得到的形如 %xx%xx的内容是小写的,Java 的是大写的。 char[] temp = HttpUtility.UrlEncode(s).ToCharArray(); for (int i = 0; i < temp.Length - 2; i++) { if (temp[i] == '%') { temp[i + 1] = char.ToUpper(temp[i + 1]); temp[i + 2] = char.ToUpper(temp[i + 2]); } } return new string(temp); } public string HttpGetUrl(string Url, Dictionary ditParam) { ComputeSignature(ditParam); var param = string.Join("&", ditParam.Select(x => x.Key + "=" + HttpUtility.UrlEncode(x.Value.ToString()))); var u = Url + (param == "" ? "" : "?") + param; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(u); request.Method = "GET"; request.ContentType = "text/html;charset=UTF-8"; HttpWebResponse response; try { response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { response = (HttpWebResponse)ex.Response; } Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } } public class Credentials { public string SecurityToken { get; set; } public string AccessKeyId { get; set; } public string AccessKeySecret { get; set; } public string Expiration { get; set; } } }