百度云存储接口上传文件 【NodeJS 学习笔记01】不学就老了 前言 模块机制/CommonJs 包与NPM 结语
C#调用百度云存储接口上传文件
因前几日见园子里有人说可以把网站静态文件放在百度上,于是去百度开放平台看了看,发现之前那篇文章不是调的云存储接口啊。。。
于是自己写了个C#能调百度云存储的例子(百度云开放平台只提供php、java、Python、c++),下面贴一下步骤和代码,还请多多指点啊!
一、libcurl.NET
百度提供的四种途径我们选择的是curl方式,但是大家都知道curl需要linux环境支持,这里引用了国外的libcurl.NET开源项目。下载最新版本的libcurlnet-1_3.zip,解压后将这(ca-bundle.crt、libcurl.dll、LibCurlNet.dll、LibCurlShim.dll)四个文件放在你自己项目的bin目录下。
然后项目里添加LibCurlNet.dll引用。
二、签名算法
百度的URL签名算法说是用的sha1加密,千万别理解错!这里我是从php的hash_hmac算法转的,代码如下:
/// <summary>
/// hmacSha1算法加密
/// </summary>
/// <param name="encryptText">加密明文</param>
/// <param name="encryptKey">加密密钥</param>
/// <returns></returns>
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}
1 /// <summary> 2 /// hmacSha1算法加密 3 /// </summary> 4 /// <param name="encryptText">加密明文</param> 5 /// <param name="encryptKey">加密密钥</param> 6 /// <returns></returns> 7 public static string hmacSha1(string encryptText, string encryptKey) 8 { 9 HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey)); 10 byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText)); 11 return Convert.ToBase64String(RstRes); 12 }
三、实现curl上传
其实就是要将下面这段命令翻译成C#
1
2
|
废话不多直接上代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using SeasideResearch.LibCurlNet;
namespace BaiduCloudStorage
{
class Program
{
static void Main(string[] args)
{
string flag = "MBO";
string accessKey = "83ee44XXXX0799394e9fXXXXa731XXXX";
string secrectKey = "0Aa2XXXXdff516c44XXXX9e1ef0XXXX1";
string bucket = "sitefiles", sobject = "Media/80cb39dbb6fd526694279e79aa18972bd407364a.jpg";
string content = flag + "
";
content += "Method=PUT
";
content += "Bucket=sitefiles
";
content += "Object=/" + sobject + "
";
//content += "Ip=115.173.192.3
";
//content += "Time=2014-01-13
";
//content += "Size=1024
"; // B字节
string signture = flag + ":" + accessKey + ":" + HttpUtility.UrlEncode(hmacSha1(content, secrectKey));
string url = "http://bcs.duapp.com/" + bucket + "/" + HttpUtility.UrlEncode(sobject) + "?sign=" + signture;
FileStream fs = new FileStream(@"D:Media9e1e73600c338744337ee82c500fd9f9d62aa0e6.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
try
{
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
Easy easy = new Easy();
Easy.ReadFunction rf = new Easy.ReadFunction(OnReadData);
easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, rf);
easy.SetOpt(CURLoption.CURLOPT_READDATA, fs);
Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, url);
easy.SetOpt(CURLoption.CURLOPT_UPLOAD, 1);
easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length);
easy.SetOpt(CURLoption.CURLOPT_VERBOSE, 1);
easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wf);
Easy.DebugFunction df = new Easy.DebugFunction(OnDebug);
easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df);
easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true);
easy.Perform();
easy.Cleanup();
fs.Close();
Curl.GlobalCleanup();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
public static Int32 OnReadData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
FileStream fs = (FileStream)extraData;
return fs.Read(buf, 0, size * nmemb);
}
public static void OnDebug(CURLINFOTYPE infoType, String msg, Object extraData)
{
// Console.WriteLine(msg);
}
public static Int32 OnProgress(Object extraData, Double dlTotal, Double dlNow, Double ulTotal, Double ulNow)
{
Console.WriteLine("Progress: {0} {1} {2} {3}", dlTotal, dlNow, ulTotal, ulNow);
return 0; // standard return from PROGRESSFUNCTION
}
public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
Console.Write(System.Text.Encoding.UTF8.GetString(buf));
return size * nmemb;
}
/// <summary>
/// hmacSha1算法加密
/// </summary>
/// <param name="encryptText">加密明文</param>
/// <param name="encryptKey">加密密钥</param>
/// <returns></returns>
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}
}
}
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Security.Cryptography; 6 using System.Text; 7 using System.Web; 8 using SeasideResearch.LibCurlNet; 9 10 namespace BaiduCloudStorage 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 string flag = "MBO"; 17 string accessKey = "83ee44XXXX0799394e9fXXXXa731XXXX"; 18 string secrectKey = "0Aa2XXXXdff516c44XXXX9e1ef0XXXX1"; 19 string bucket = "sitefiles", sobject = "Media/80cb39dbb6fd526694279e79aa18972bd407364a.jpg"; 20 string content = flag + " "; 21 content += "Method=PUT "; 22 content += "Bucket=sitefiles "; 23 content += "Object=/" + sobject + " "; 24 //content += "Ip=115.173.192.3 "; 25 //content += "Time=2014-01-13 "; 26 //content += "Size=1024 "; // B字节 27 28 string signture = flag + ":" + accessKey + ":" + HttpUtility.UrlEncode(hmacSha1(content, secrectKey)); 29 string url = "http://bcs.duapp.com/" + bucket + "/" + HttpUtility.UrlEncode(sobject) + "?sign=" + signture; 30 31 FileStream fs = new FileStream(@"D:Media9e1e73600c338744337ee82c500fd9f9d62aa0e6.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); 32 33 try 34 { 35 Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 36 37 Easy easy = new Easy(); 38 Easy.ReadFunction rf = new Easy.ReadFunction(OnReadData); 39 easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, rf); 40 easy.SetOpt(CURLoption.CURLOPT_READDATA, fs); 41 42 Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData); 43 easy.SetOpt(CURLoption.CURLOPT_URL, url); 44 easy.SetOpt(CURLoption.CURLOPT_UPLOAD, 1); 45 easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length); 46 47 easy.SetOpt(CURLoption.CURLOPT_VERBOSE, 1); 48 easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wf); 49 50 Easy.DebugFunction df = new Easy.DebugFunction(OnDebug); 51 easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df); 52 easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true); 53 54 easy.Perform(); 55 easy.Cleanup(); 56 fs.Close(); 57 58 Curl.GlobalCleanup(); 59 60 } 61 catch (Exception ex) 62 { 63 Console.WriteLine(ex); 64 } 65 66 Console.ReadKey(); 67 } 68 69 public static Int32 OnReadData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) 70 { 71 FileStream fs = (FileStream)extraData; 72 return fs.Read(buf, 0, size * nmemb); 73 } 74 75 public static void OnDebug(CURLINFOTYPE infoType, String msg, Object extraData) 76 { 77 // Console.WriteLine(msg); 78 } 79 80 public static Int32 OnProgress(Object extraData, Double dlTotal, Double dlNow, Double ulTotal, Double ulNow) 81 { 82 Console.WriteLine("Progress: {0} {1} {2} {3}", dlTotal, dlNow, ulTotal, ulNow); 83 return 0; // standard return from PROGRESSFUNCTION 84 } 85 86 public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) 87 { 88 Console.Write(System.Text.Encoding.UTF8.GetString(buf)); 89 return size * nmemb; 90 } 91 92 /// <summary> 93 /// hmacSha1算法加密 94 /// </summary> 95 /// <param name="encryptText">加密明文</param> 96 /// <param name="encryptKey">加密密钥</param> 97 /// <returns></returns> 98 public static string hmacSha1(string encryptText, string encryptKey) 99 { 100 HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey)); 101 byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText)); 102 return Convert.ToBase64String(RstRes); 103 } 104 } 105 }
至于libcurl.NET具体咋用,我这儿真没什么资料,都谷歌上查的,兄弟们有相关资料的给留个地址啊,我这还想继续完善完善啊。。。
前言
再不学nodeJs,我们就老了......在HTML5大浪袭来的时候,很多先辈就开始了NodeJs之旅,而那时我还在做服务器端的程序
后来转成前端,和梯队的距离已经很大了,因为我会服务器端语言,还干了很久,所以至今才开始学习NodeJs,向完整的前端前进
这次学习NodeJs的计划是:
① 1-2周学习基础知识
② 1周左右开发一个简单项目
③ 利用NodeJs开发一套用于移动端调试的工具
④ 打包相关(这个可能比较远了)
NodeJs特点
① 异步
从文件读取到网络请求,NodeJs皆以异步完成,回调函数占据重要作用,在编程模型上Node是领先的
② 事件回调
事件回调让程序变得轻巧,但是具体怎么样还是取决于程序员。但是回调函数在阅读上其实还是有一定难度的
③ 单线程
Node是单线程的,如果多线程的话,这门语言水又深了,问几句进程中的通信时很讨厌的,但线程也没有死锁等问题
但是性能相关就有问题了,因为不能利用多核;
模块机制/CommonJs
我们原来做服务器端的开发,如果没有很好的组织代码的话,后期维护非常困难,所以才会有什么MVC,什么三层架构
而现在前端的业务逻辑逐向后端靠拢,就单页应用来说,已经超过后端的程序逻辑
页面view不停的增加会带来js代码量的激增,如何很好的管理我们的前端代码成了一个问题,所以requireJs出现了......
PS:尼玛这段和nodeJs有一毛钱关系哇......
javascript是没有模块化系统的,于是就有CommonJs的提出,让js具备开发大型应用的基础
模块引用
我们如果要引用一个模块,比如数学计算相关:
var math = require('math');
模块定义
我们如果要定义自己的模块可以这样干
exports.add = function () { return sum; }
如果此函数在math中定义的话,就能使用了
math.add();
模块标识
模块标识就是传递给require的参数,需要为驼峰命名,指向的是一个文件路径,这里和requireJS很类似的
模块实现
Node中模块实现分为两类,一种是系统级别的核心模块,一种是用户编写的文件模块
核心模块在编译过程被翻译成了二进制文件,Node进程启动后,一些核心的模块会直接加载进内存(文件定位、编译执行)
文件模块需要动态加载,速度相对慢一点
但是一旦加载后,那些文件便会被缓存,二次引入时候便会读取缓存文件(编译后的文件)
这里扯远一点,我们在使用underscore过程中,会编译Html形成模板函数(他真的只是一个函数),其实这个就可以做缓存
在部署项目之前保存编译过后的函数,去掉html模板文件(优化效果不知)
在node中,每个模块都是一个对象:
function Module(id, parent) { this.id = id; this.exports = {}; //parent是关键字,不应该乱用 this.parent = parent; if (parent && parent.children) { parent.children.push(this); } this.filename = null; this.loaded = false; this.children = []; }
编译和执行时引入文件模块的最后一个阶段,定位到具体文件后,node会新建一个模块对象,然后根据路径载入并编译
每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache上
每个模块文件都存在require、exports、module三个变量,但是在文件中并未定义(__filename__、__dirname__ 变量也是)
其实在编译过程中,Node对javascript文件内容进行了头尾包装(相当于自定义函数传入window)
(function (exports, require, module, __filename__, __dirname__) { var math = require('math'); exports.area = function (radius) { return ''; }; });
这样,模块与模块之间做了隔离,不会互相影响,这里和underscore的编译有些类似......
包与NPM
Node组织了自身的核心模块,所以第三方文件模块可以有序的编写和使用,但是在第三方模块中,模块与模块之间仍然散列在各地
相互之间不能直接引用,在模块外包和NPM则是将联系建立起来的一种机制
PS:很多模块会形成一个包,这个包的概念和java包的概念,才#程序集的概念应该相似
一个包结构解压后会形成几个文件:
① package.json 描述文件
② bin 可执行二进制目录
③ lib javascript代码目录
④ doc 文档(尼玛基本没有)
⑤ test demo
以上都是CommonJS包的规范的一些东西,但是我们稍微了解一下便可(初学嘛),NPM则需要熟练掌握,借助NPM我们可以熟练安装管理包
安装依赖包
安装依赖包是常用方法:
npm install express
执行后就会在当前目录下创建node_modules目录,然后再其下面创建express目录......
PS:express是NodeJs上流行的web开发框架,帮助我们快速开发一个web应用
安装结束后就可调用了:
var express = require('express');
结语
这段简单结束,后面我们项目实战过程逐步深化
因前几日见园子里有人说可以把网站静态文件放在百度上,于是去百度开放平台看了看,发现之前那篇文章不是调的云存储接口啊。。。
于是自己写了个C#能调百度云存储的例子(百度云开放平台只提供php、java、Python、c++),下面贴一下步骤和代码,还请多多指点啊!
一、libcurl.NET
百度提供的四种途径我们选择的是curl方式,但是大家都知道curl需要linux环境支持,这里引用了国外的libcurl.NET开源项目。下载最新版本的libcurlnet-1_3.zip,解压后将这(ca-bundle.crt、libcurl.dll、LibCurlNet.dll、LibCurlShim.dll)四个文件放在你自己项目的bin目录下。
然后项目里添加LibCurlNet.dll引用。
二、签名算法
百度的URL签名算法说是用的sha1加密,千万别理解错!这里我是从php的hash_hmac算法转的,代码如下:
/// <summary>
/// hmacSha1算法加密
/// </summary>
/// <param name="encryptText">加密明文</param>
/// <param name="encryptKey">加密密钥</param>
/// <returns></returns>
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}
1 /// <summary> 2 /// hmacSha1算法加密 3 /// </summary> 4 /// <param name="encryptText">加密明文</param> 5 /// <param name="encryptKey">加密密钥</param> 6 /// <returns></returns> 7 public static string hmacSha1(string encryptText, string encryptKey) 8 { 9 HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey)); 10 byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText)); 11 return Convert.ToBase64String(RstRes); 12 }
三、实现curl上传
其实就是要将下面这段命令翻译成C#
1
2
|
废话不多直接上代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using SeasideResearch.LibCurlNet;
namespace BaiduCloudStorage
{
class Program
{
static void Main(string[] args)
{
string flag = "MBO";
string accessKey = "83ee44XXXX0799394e9fXXXXa731XXXX";
string secrectKey = "0Aa2XXXXdff516c44XXXX9e1ef0XXXX1";
string bucket = "sitefiles", sobject = "Media/80cb39dbb6fd526694279e79aa18972bd407364a.jpg";
string content = flag + "
";
content += "Method=PUT
";
content += "Bucket=sitefiles
";
content += "Object=/" + sobject + "
";
//content += "Ip=115.173.192.3
";
//content += "Time=2014-01-13
";
//content += "Size=1024
"; // B字节
string signture = flag + ":" + accessKey + ":" + HttpUtility.UrlEncode(hmacSha1(content, secrectKey));
string url = "http://bcs.duapp.com/" + bucket + "/" + HttpUtility.UrlEncode(sobject) + "?sign=" + signture;
FileStream fs = new FileStream(@"D:Media9e1e73600c338744337ee82c500fd9f9d62aa0e6.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
try
{
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
Easy easy = new Easy();
Easy.ReadFunction rf = new Easy.ReadFunction(OnReadData);
easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, rf);
easy.SetOpt(CURLoption.CURLOPT_READDATA, fs);
Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, url);
easy.SetOpt(CURLoption.CURLOPT_UPLOAD, 1);
easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length);
easy.SetOpt(CURLoption.CURLOPT_VERBOSE, 1);
easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wf);
Easy.DebugFunction df = new Easy.DebugFunction(OnDebug);
easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df);
easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true);
easy.Perform();
easy.Cleanup();
fs.Close();
Curl.GlobalCleanup();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
public static Int32 OnReadData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
FileStream fs = (FileStream)extraData;
return fs.Read(buf, 0, size * nmemb);
}
public static void OnDebug(CURLINFOTYPE infoType, String msg, Object extraData)
{
// Console.WriteLine(msg);
}
public static Int32 OnProgress(Object extraData, Double dlTotal, Double dlNow, Double ulTotal, Double ulNow)
{
Console.WriteLine("Progress: {0} {1} {2} {3}", dlTotal, dlNow, ulTotal, ulNow);
return 0; // standard return from PROGRESSFUNCTION
}
public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
Console.Write(System.Text.Encoding.UTF8.GetString(buf));
return size * nmemb;
}
/// <summary>
/// hmacSha1算法加密
/// </summary>
/// <param name="encryptText">加密明文</param>
/// <param name="encryptKey">加密密钥</param>
/// <returns></returns>
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}
}
}
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Security.Cryptography; 6 using System.Text; 7 using System.Web; 8 using SeasideResearch.LibCurlNet; 9 10 namespace BaiduCloudStorage 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 string flag = "MBO"; 17 string accessKey = "83ee44XXXX0799394e9fXXXXa731XXXX"; 18 string secrectKey = "0Aa2XXXXdff516c44XXXX9e1ef0XXXX1"; 19 string bucket = "sitefiles", sobject = "Media/80cb39dbb6fd526694279e79aa18972bd407364a.jpg"; 20 string content = flag + " "; 21 content += "Method=PUT "; 22 content += "Bucket=sitefiles "; 23 content += "Object=/" + sobject + " "; 24 //content += "Ip=115.173.192.3 "; 25 //content += "Time=2014-01-13 "; 26 //content += "Size=1024 "; // B字节 27 28 string signture = flag + ":" + accessKey + ":" + HttpUtility.UrlEncode(hmacSha1(content, secrectKey)); 29 string url = "http://bcs.duapp.com/" + bucket + "/" + HttpUtility.UrlEncode(sobject) + "?sign=" + signture; 30 31 FileStream fs = new FileStream(@"D:Media9e1e73600c338744337ee82c500fd9f9d62aa0e6.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); 32 33 try 34 { 35 Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 36 37 Easy easy = new Easy(); 38 Easy.ReadFunction rf = new Easy.ReadFunction(OnReadData); 39 easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, rf); 40 easy.SetOpt(CURLoption.CURLOPT_READDATA, fs); 41 42 Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData); 43 easy.SetOpt(CURLoption.CURLOPT_URL, url); 44 easy.SetOpt(CURLoption.CURLOPT_UPLOAD, 1); 45 easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length); 46 47 easy.SetOpt(CURLoption.CURLOPT_VERBOSE, 1); 48 easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wf); 49 50 Easy.DebugFunction df = new Easy.DebugFunction(OnDebug); 51 easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df); 52 easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true); 53 54 easy.Perform(); 55 easy.Cleanup(); 56 fs.Close(); 57 58 Curl.GlobalCleanup(); 59 60 } 61 catch (Exception ex) 62 { 63 Console.WriteLine(ex); 64 } 65 66 Console.ReadKey(); 67 } 68 69 public static Int32 OnReadData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) 70 { 71 FileStream fs = (FileStream)extraData; 72 return fs.Read(buf, 0, size * nmemb); 73 } 74 75 public static void OnDebug(CURLINFOTYPE infoType, String msg, Object extraData) 76 { 77 // Console.WriteLine(msg); 78 } 79 80 public static Int32 OnProgress(Object extraData, Double dlTotal, Double dlNow, Double ulTotal, Double ulNow) 81 { 82 Console.WriteLine("Progress: {0} {1} {2} {3}", dlTotal, dlNow, ulTotal, ulNow); 83 return 0; // standard return from PROGRESSFUNCTION 84 } 85 86 public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) 87 { 88 Console.Write(System.Text.Encoding.UTF8.GetString(buf)); 89 return size * nmemb; 90 } 91 92 /// <summary> 93 /// hmacSha1算法加密 94 /// </summary> 95 /// <param name="encryptText">加密明文</param> 96 /// <param name="encryptKey">加密密钥</param> 97 /// <returns></returns> 98 public static string hmacSha1(string encryptText, string encryptKey) 99 { 100 HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey)); 101 byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText)); 102 return Convert.ToBase64String(RstRes); 103 } 104 } 105 }
至于libcurl.NET具体咋用,我这儿真没什么资料,都谷歌上查的,兄弟们有相关资料的给留个地址啊,我这还想继续完善完善啊。。。
前言
再不学nodeJs,我们就老了......在HTML5大浪袭来的时候,很多先辈就开始了NodeJs之旅,而那时我还在做服务器端的程序
后来转成前端,和梯队的距离已经很大了,因为我会服务器端语言,还干了很久,所以至今才开始学习NodeJs,向完整的前端前进
这次学习NodeJs的计划是:
① 1-2周学习基础知识
② 1周左右开发一个简单项目
③ 利用NodeJs开发一套用于移动端调试的工具
④ 打包相关(这个可能比较远了)
NodeJs特点
① 异步
从文件读取到网络请求,NodeJs皆以异步完成,回调函数占据重要作用,在编程模型上Node是领先的
② 事件回调
事件回调让程序变得轻巧,但是具体怎么样还是取决于程序员。但是回调函数在阅读上其实还是有一定难度的
③ 单线程
Node是单线程的,如果多线程的话,这门语言水又深了,问几句进程中的通信时很讨厌的,但线程也没有死锁等问题
但是性能相关就有问题了,因为不能利用多核;
模块机制/CommonJs
我们原来做服务器端的开发,如果没有很好的组织代码的话,后期维护非常困难,所以才会有什么MVC,什么三层架构
而现在前端的业务逻辑逐向后端靠拢,就单页应用来说,已经超过后端的程序逻辑
页面view不停的增加会带来js代码量的激增,如何很好的管理我们的前端代码成了一个问题,所以requireJs出现了......
PS:尼玛这段和nodeJs有一毛钱关系哇......
javascript是没有模块化系统的,于是就有CommonJs的提出,让js具备开发大型应用的基础
模块引用
我们如果要引用一个模块,比如数学计算相关:
var math = require('math');
模块定义
我们如果要定义自己的模块可以这样干
exports.add = function () { return sum; }
如果此函数在math中定义的话,就能使用了
math.add();
模块标识
模块标识就是传递给require的参数,需要为驼峰命名,指向的是一个文件路径,这里和requireJS很类似的
模块实现
Node中模块实现分为两类,一种是系统级别的核心模块,一种是用户编写的文件模块
核心模块在编译过程被翻译成了二进制文件,Node进程启动后,一些核心的模块会直接加载进内存(文件定位、编译执行)
文件模块需要动态加载,速度相对慢一点
但是一旦加载后,那些文件便会被缓存,二次引入时候便会读取缓存文件(编译后的文件)
这里扯远一点,我们在使用underscore过程中,会编译Html形成模板函数(他真的只是一个函数),其实这个就可以做缓存
在部署项目之前保存编译过后的函数,去掉html模板文件(优化效果不知)
在node中,每个模块都是一个对象:
function Module(id, parent) { this.id = id; this.exports = {}; //parent是关键字,不应该乱用 this.parent = parent; if (parent && parent.children) { parent.children.push(this); } this.filename = null; this.loaded = false; this.children = []; }
编译和执行时引入文件模块的最后一个阶段,定位到具体文件后,node会新建一个模块对象,然后根据路径载入并编译
每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache上
每个模块文件都存在require、exports、module三个变量,但是在文件中并未定义(__filename__、__dirname__ 变量也是)
其实在编译过程中,Node对javascript文件内容进行了头尾包装(相当于自定义函数传入window)
(function (exports, require, module, __filename__, __dirname__) { var math = require('math'); exports.area = function (radius) { return ''; }; });
这样,模块与模块之间做了隔离,不会互相影响,这里和underscore的编译有些类似......
包与NPM
Node组织了自身的核心模块,所以第三方文件模块可以有序的编写和使用,但是在第三方模块中,模块与模块之间仍然散列在各地
相互之间不能直接引用,在模块外包和NPM则是将联系建立起来的一种机制
PS:很多模块会形成一个包,这个包的概念和java包的概念,才#程序集的概念应该相似
一个包结构解压后会形成几个文件:
① package.json 描述文件
② bin 可执行二进制目录
③ lib javascript代码目录
④ doc 文档(尼玛基本没有)
⑤ test demo
以上都是CommonJS包的规范的一些东西,但是我们稍微了解一下便可(初学嘛),NPM则需要熟练掌握,借助NPM我们可以熟练安装管理包
安装依赖包
安装依赖包是常用方法:
npm install express
执行后就会在当前目录下创建node_modules目录,然后再其下面创建express目录......
PS:express是NodeJs上流行的web开发框架,帮助我们快速开发一个web应用
安装结束后就可调用了:
var express = require('express');
结语
这段简单结束,后面我们项目实战过程逐步深化