腾讯云图片鉴黄集成到C#
官方文档:https://cloud.tencent.com/document/product/641/12422
请求官方API及签名的生成代码如下:
public class TencentCloundPicHelper { /// <summary> /// 发送Post请求腾讯云 /// </summary> public string SendPost(string postDataStr) { var url = @"http://service.image.myqcloud.com/detection/porn_detect"; try { System.Net.ServicePointManager.Expect100Continue = false; var request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "POST"; SetHeaderValue(request.Headers, "content-type", "application/json"); SetHeaderValue(request.Headers, "content-length", postDataStr.Length.ToString()); SetHeaderValue(request.Headers, "Host", "service.image.myqcloud.com"); SetHeaderValue(request.Headers, "authorization", GetSign()); var memStream = new MemoryStream(); var jsonByte = Encoding.GetEncoding("utf-8").GetBytes(postDataStr); memStream.Write(jsonByte, 0, jsonByte.Length); request.ContentLength = memStream.Length; var requestStream = request.GetRequestStream(); memStream.Position = 0; var tempBuffer = new byte[memStream.Length]; memStream.Read(tempBuffer, 0, tempBuffer.Length); memStream.Close(); requestStream.Write(tempBuffer, 0, tempBuffer.Length); requestStream.Close(); var response = request.GetResponse(); using (var s = response.GetResponseStream()) { var reader = new StreamReader(s, Encoding.UTF8); return reader.ReadToEnd(); } } catch (WebException we) { if (we.Status == WebExceptionStatus.ProtocolError) { using (var s = we.Response.GetResponseStream()) { var reader = new StreamReader(s, Encoding.UTF8); return reader.ReadToEnd(); } } else { throw we; } } catch (Exception e) { throw e; } } /// <summary> /// 获取签名 /// </summary> public static string GetSign() { var appId = ConfigurationManager.AppSettings["AppId"];//开发者的 APPID,接入智能图像时由系统生成 var bucket = "tengxunyun";//Bucket,空间名称,即图片资源的组织管理单元 var secretId = ConfigurationManager.AppSettings["SecretId"];//Secret ID var secretKey = ConfigurationManager.AppSettings["SecretKey"];//secretKey var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); var currentTime = Convert.ToInt64(ts.TotalSeconds);//当前时间戳,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒,多次签名时,e 应大于 t var expiredTime = Convert.ToInt64((DateTime.UtcNow.AddMinutes(180) - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);//签名的有效期,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒;单次签名时,e 必须设置为 0 var rand = GetRandom();//随机串,无符号 10 进制整数,用户需自行生成,最长 10 位 var userid = 0;//历史遗留字段,请填写为 0 var fileid = "";//资源存储的唯一标识,单次签名必填;多次签名选填,如填写则会验证与当前操作的文件路径是否一致。 var encryptText = $"a={appId}&b={bucket}&k={secretId}&e={expiredTime}&t={currentTime}&r={rand}&u=0&f="; var sign = Hmacsha1Encrypt(encryptText, secretKey); return sign; } /// <summary> /// 设置Http post请求头 /// </summary> public static void SetHeaderValue(WebHeaderCollection header, string name, string value) { var property = typeof(WebHeaderCollection).GetProperty("InnerCollection", BindingFlags.Instance | BindingFlags.NonPublic); if (property != null) { var collection = property.GetValue(header, null) as NameValueCollection; collection[name] = value; } } /// <summary> /// HMACSHA1算法加密 /// </summary> private static string Hmacsha1Encrypt(string encryptText, string encryptKey) { using (HMACSHA1 mac = new HMACSHA1(Encoding.UTF8.GetBytes(encryptKey))) { var hash = mac.ComputeHash(Encoding.UTF8.GetBytes(encryptText)); var pText = Encoding.UTF8.GetBytes(encryptText); var all = new byte[hash.Length + pText.Length]; Array.Copy(hash, 0, all, 0, hash.Length); Array.Copy(pText, 0, all, hash.Length, pText.Length); return Convert.ToBase64String(all); } } /// <summary> /// 获取随机数 /// </summary> private static int GetRandom() { var random = new Random(); var rand = random.Next(10000, 999999999); return rand; } }
SQL Server 怎么在分页获取数据的同时获取到总记录数
SQL Server 获取数据的总记录数,有两种方式:
1.先分页获取数据,然后再查询一遍数据库获取到总数量
2.使用count(1) over()获取总记录数量
SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Id DESC) rn, COUNT(1) OVER() AS TotalCount, Id FROM dbo.T_User )a WHERE a.rn BETWEEN 1 AND 5
第二种方式既分页还能获取到总记录数量。就是多一个字段,如果获取一次数据较多的话,会浪费一些流量。
如果使用第一种的话,会多访问一次数据库,增加一次数据连接的关闭和打开,会消耗数据库资源。
第二种方式还是我同事开始使用的,然后我们就这样使用了。
注意:目前发现只有sqlserver有,mysql没有这个效果,大家如果发现其他的可以使用,可以评论。3Q.
sqlserver 操作数据表语句模板
从网上搜的,一点一点加吧。
-----------设置事务全部回滚----------------- SET XACT_ABORT ON BEGIN BEGIN TRY BEGIN TRANSACTION TR ---------------------------------删除表======================= --DROP TABLE T_QuestionBankItem ---=================================修改列名======================================== --exec sp_rename 'T_MyCourse.CourseClassId' , 'ClassId', 'column' -----==========================修改字段类型及默认值------------------ --ALTER TABLE T_Message ALTER COLUMN Title nvarchar(20) NOT NULL --===========================增加列======================================---- ----------------T_AssNews------------- --alter table T_AssNews ADD ViewCount int NOT NULL Default 0 --EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'浏览量' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_AssNews', @level2type=N'COLUMN',@level2name=N'ViewCount' -----------删除字段、先删除约束 --ALTER TABLE [dbo].[T_TICategory] DROP CONSTRAINT [DF_T_TICategory_TrainingInstitutionId] --ALTER TABLE T_TICategory DROP COLUMN TrainingInstitutionId COMMIT TRANSACTION TR END TRY BEGIN CATCH PRINT 'EXECUTED FAILED'; select error_number() as error_number , error_message() as error_message ROLLBACK TRANSACTION TR RETURN END CATCH END
.NET MVC后台发送post请求
一、WebRequest方式
//设置请求接口 var request = (HttpWebRequest)WebRequest.Create("http://xxx.com/xxx"); //请求参数 var postData = string.Format("appId={0}&appScreat={1}&channel={2}", appId, appScreat, channel); var data = Encoding.ASCII.GetBytes(postData); //请求方式 request.Method = "POST"; //请求头参数设置 request.Headers.Add("sign", sign); request.Headers.Add("timestamp", timestamp); request.Headers.Add("token", token); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } //结果返回 var response = (HttpWebResponse)request.GetResponse(); //转字符串 var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); //转换为json对象 MXCZUserInfoResponse userInfoResponse = JsonConvert.DeserializeObject<MXCZUserInfoResponse>(responseString);
百度api查询多个地址的经纬度的问题
在使用百度api查询多个地址的经纬度的时候,由于百度api提供的经纬度查询方法是回调函数,并且后续操作必须等经纬度获取完成才能进行,问题就存在于怎么判断所有地点是否都回调完成了,问了之前的一个前端大佬同事(我是一只前端弱鸡),给我提供的思路,在百度api的回调函数里面再调一次自定义的回调函数,从而在自定义的函数里面进行判断所有地点是否都回调完成了。
下面是具体代码,
1 <script> 2 //所有待查询经纬度的地点 3 var allAddress=new Array("北京西站","成都东站","上海南站","西安北站"); 4 //回调前计数用 5 var callbackBefore = 0; 6 //回调后计数用 7 var callbackAfter = 0; 8 //存放经纬度 9 var geoCoord={}; 10 //循环所有地址 11 for (var i = 0; i < allAddress.length; i++) { 12 //先判断是否已经查询了经纬度(排重) 13 if (!(allAddress[i] in geoCoord)) { 14 //去调百度api,查经纬度了,先记个数 15 callbackBefore++; 16 GetPoint(allAddress[i], function (address, point) { 17 //回调回来了,经纬度,再记个数 18 callbackAfter++; 19 geoCoord[address] = point; 20 //判断回调之前的数目和回调之后的数目是否一样,一样就表示所有地址都查询完了 21 if (callbackBefore == callbackAfter) { 22 //去做你想做的操作了吧 23 //Travel(geoCoord); 24 return; 25 } 26 }); 27 } 28 29 } 30 //查询经纬度的函数 31 function GetPoint(address, callback) { 32 var local = new BMap.LocalSearch(address, 33 { 34 //智能搜索,这本来就是一个回调的方法 35 "onSearchComplete": function (obj) { 36 //存放经纬度 37 var point = []; 38 if (obj && obj.getPoi(0)) { 39 var pp = obj.getPoi(0).point; 40 point.push(pp.lng); 41 point.push(pp.lat); 42 //回调方法 43 callback(address, point); 44 } 45 } 46 }); 47 local.search(address); 48 } 49 </script>
我实际情况是那个地址allAddress比较复杂,需要二次循环,不像上面例子这么简单,所以才使用的这种方法。
try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?
这是一道面试题,首先finally{}里面的code肯定是会执行的,至于在return前还是后,
看答案说的是在return后执行,我觉得不对,百度了一下,有说return前的,有说return后的,还有return中间执行的。遂做了一个小测试如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
static void Main( string [] args)
{
//测试
Test();
System.Console.WriteLine( "结束了" );
System.Console.ReadLine();
}
/// <summary>
/// 测试
/// </summary>
/// <returns></returns>
private static int Test()
{
try
{
System.Console.WriteLine( "好,开始了" );
return ReturnInt();
}
catch (Exception exception)
{
System.Console.WriteLine( "我是异常" );
throw ;
}
finally
{
System.Console.WriteLine( "我是finally" );
}
}
/// <summary> /// 返回数字 /// </summary> /// <returns></returns> private static int ReturnInt()
{
System.Console.WriteLine( "我是return" );
return 1;
}
|
测试结果如下:
所以我觉得finally{}里面的code是在return之后执行的。
此测试较粗糙,如有其它方法证明,望告知。
----------------------------------------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------------------------------------------------------------------
之前的测试果然很粗糙,搞错了一个概念,return到底是在什么时候才算执行,什么时候执行完。上面打印“我是return”的时候,我以为是return执行完了,其实那个时候只是去准备return的返回值去了,并没有真正的返回“1”并跳出Test()方法,准备好返回值之后,接着去执行finally{}里面的code,打印了“我是finally”,最后Test()方法才算执行完,并真正的返回(return)“1”到main里面。
按照@以后会觉得昵称很幼稚 老哥的提醒,修改了一下main()里面的代码,
1
2
3
4
5
6
7
|
static void Main( string [] args)
{ //测试
Console.WriteLine( "Test结果:" + Test());
System.Console.WriteLine( "结束了" );
System.Console.ReadLine();
} |
结果如下:
所以finally{}里面的code应该是在return之前执行的。
在http://bbs.csdn.net/topics/60474475 此贴中,五楼的老哥的话,“函数应该是栈调用,如果先执行return ,哪不是退到上个栈了,怎么调用finally, 所以我觉得先调用finally”,
在http://blog.csdn.net/gaoyuanfeng/article/details/4064388 文章中,finally与return的关系也讲得很明白了,这一天天的真是受教了。
js获取某个日期所在周周一的日期
第一次写,做个小笔记。
第一步:获取该日期的星期数;
第二步:在该日期上减去他的星期数再减1,(注:星期日获取到的星期数是0);
下面是具体代码:
1
2
3
4
5
6
7
8
9
|
function GetMonday(dd) {
var week = dd.getDay(); //获取时间的星期数
var minus = week ? week - 1 : 6;
dd.setDate(dd.getDate() - minus); //获取minus天前的日期
var y = dd.getFullYear();
var m = dd.getMonth() + 1; //获取月份
var d = dd.getDate();
return y + "-" + m + "-" + d;
} |