index.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. /*!
  2. * oss - node.js sdk
  3. * util -- useful functions support
  4. * Copyright(c) 2012 fantaysni <fantasyni@163.com>
  5. * MIT Licensed
  6. */
  7. var crypto = require('crypto');
  8. /**
  9. * 检验bucket名称是否合法
  10. * bucket的命名规范:
  11. * 1. 只能包括小写字母,数字,下划线(_)和短横线(-)
  12. * 2. 必须以小写字母或者数字开头
  13. * 3. 长度必须在3-255字节之间
  14. */
  15. exports.validate_bucket = function(bucket){
  16. var pattern = /^[a-z0-9][a-z0-9_\\-]{2,254}$/;
  17. if( !pattern.test(bucket)) {
  18. return false;
  19. }
  20. return true;
  21. }
  22. /**
  23. * 检验object名称是否合法
  24. * object命名规范:
  25. * 1. 规则长度必须在1-1023字节之间
  26. * 2. 使用UTF-8编码
  27. */
  28. exports.validate_object = function(object){
  29. var pattern = /^.{1,1023}$/;
  30. if(object == null || !pattern.test(object)){
  31. return false;
  32. }
  33. return true;
  34. }
  35. /*
  36. * check for gb2312
  37. */
  38. exports.is_gb2312 = function(object){
  39. var reg = new RegExp("[\\u4E00-\\u9FFF]+","g");
  40. if(reg.test(object)){
  41. return true;
  42. }
  43. return false;
  44. }
  45. /*
  46. * encode convert
  47. * utf8 -> gb2312
  48. * gb2312 -> utf8
  49. */
  50. exports.iconv = function(from_code,to_code,str){
  51. this.Dig2Dec=function(s){
  52. var retV = 0;
  53. if(s.length == 4){
  54. for(var i = 0; i < 4; i ++){
  55. retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
  56. }
  57. return retV;
  58. }
  59. return -1;
  60. }
  61. this.Hex2Utf8=function(s){
  62. var retS = "";
  63. var tempS = "";
  64. var ss = "";
  65. if(s.length == 16){
  66. tempS = "1110" + s.substring(0, 4);
  67. tempS += "10" + s.substring(4, 10);
  68. tempS += "10" + s.substring(10,16);
  69. var sss = "0123456789ABCDEF";
  70. for(var i = 0; i < 3; i ++){
  71. retS += "%";
  72. ss = tempS.substring(i * 8, (eval(i)+1)*8);
  73. retS += sss.charAt(this.Dig2Dec(ss.substring(0,4)));
  74. retS += sss.charAt(this.Dig2Dec(ss.substring(4,8)));
  75. }
  76. return retS;
  77. }
  78. return "";
  79. }
  80. this.Dec2Dig=function(n1){
  81. var s = "";
  82. var n2 = 0;
  83. for(var i = 0; i < 4; i++){
  84. n2 = Math.pow(2,3 - i);
  85. if(n1 >= n2){
  86. s += '1';
  87. n1 = n1 - n2;
  88. }
  89. else
  90. s += '0';
  91. }
  92. return s;
  93. }
  94. this.Str2Hex=function(s){
  95. var c = "";
  96. var n;
  97. var ss = "0123456789ABCDEF";
  98. var digS = "";
  99. for(var i = 0; i < s.length; i ++){
  100. c = s.charAt(i);
  101. n = ss.indexOf(c);
  102. digS += this.Dec2Dig(eval(n));
  103. }
  104. return digS;
  105. }
  106. this.Gb2312ToUtf8=function(s1){
  107. var s = escape(s1);
  108. var sa = s.split("%");
  109. var retV ="";
  110. if(sa[0] != ""){
  111. retV = sa[0];
  112. }
  113. for(var i = 1; i < sa.length; i ++){
  114. if(sa[i].substring(0,1) == "u"){
  115. retV += this.Hex2Utf8(this.Str2Hex(sa[i].substring(1,5)));
  116. if(sa[i].length){
  117. retV += sa[i].substring(5);
  118. }
  119. }
  120. else{
  121. retV += unescape("%" + sa[i]);
  122. if(sa[i].length){
  123. retV += sa[i].substring(5);
  124. }
  125. }
  126. }
  127. return retV;
  128. }
  129. this.Utf8ToGb2312=function(str1){
  130. var substr = "";
  131. var a = "";
  132. var b = "";
  133. var c = "";
  134. var i = -1;
  135. i = str1.indexOf("%");
  136. if(i==-1){
  137. return str1;
  138. }
  139. while(i!= -1){
  140. if(i<3){
  141. substr = substr + str1.substr(0,i-1);
  142. str1 = str1.substr(i+1,str1.length-i);
  143. a = str1.substr(0,2);
  144. str1 = str1.substr(2,str1.length - 2);
  145. if(parseInt("0x" + a) & 0x80 == 0){
  146. substr = substr + String.fromCharCode(parseInt("0x" + a));
  147. }
  148. else if(parseInt("0x" + a) & 0xE0 == 0xC0){ //two byte
  149. b = str1.substr(1,2);
  150. str1 = str1.substr(3,str1.length - 3);
  151. var widechar = (parseInt("0x" + a) & 0x1F) << 6;
  152. widechar = widechar | (parseInt("0x" + b) & 0x3F);
  153. substr = substr + String.fromCharCode(widechar);
  154. }
  155. else{
  156. b = str1.substr(1,2);
  157. str1 = str1.substr(3,str1.length - 3);
  158. c = str1.substr(1,2);
  159. str1 = str1.substr(3,str1.length - 3);
  160. var widechar = (parseInt("0x" + a) & 0x0F) << 12;
  161. widechar = widechar | ((parseInt("0x" + b) & 0x3F) << 6);
  162. widechar = widechar | (parseInt("0x" + c) & 0x3F);
  163. substr = substr + String.fromCharCode(widechar);
  164. }
  165. }
  166. else {
  167. substr = substr + str1.substring(0,i);
  168. str1= str1.substring(i);
  169. }
  170. i = str1.indexOf("%");
  171. }
  172. return substr+str1;
  173. }
  174. if(from_code == "GB2312" && to_code == "UTF8"){
  175. return this.Gb2312ToUtf8(str);
  176. }else if(from_code == "UTF8" && to_code == "GB2312"){
  177. return this.Utf8ToGb2312(str);
  178. }
  179. }
  180. /**
  181. * md5
  182. * md5 the string
  183. * @param string {required}
  184. * @return string
  185. * @api public
  186. */
  187. exports.md5 = function (str) {
  188. var md5sum = crypto.createHash('md5');
  189. md5sum.update(str);
  190. str = md5sum.digest('hex');
  191. return str;
  192. }
  193. /**
  194. * base64
  195. * base64 the string
  196. * @param str {required}
  197. * @return string
  198. * @api public
  199. */
  200. exports.base64 = function(str){
  201. return crypto.createHash('md5').update(str).digest('base64');
  202. }
  203. /**
  204. * Get_Part_Size
  205. *
  206. * @param partSize {required}
  207. * @return string
  208. * @api public
  209. */
  210. exports.getPartSize = function(partSize){
  211. var _partSize = 0;
  212. if(partSize <= 5242880){
  213. _partSize = 5242880; //5M
  214. }else if(partSize > 524288000){
  215. _partSize = 524288000; //500M
  216. }else{
  217. _partSize = 52428800; //50M
  218. }
  219. return _partSize;
  220. }
  221. /**
  222. * Get_File_Name
  223. *
  224. * @param fileName {required}
  225. * @return string
  226. * @api public
  227. */
  228. exports.getFileName = function(name){
  229. for(var i=name.length-1;i>=0;i--){
  230. if(name[i] == '/'){
  231. return name.substr(i+1);
  232. }
  233. }
  234. return name;
  235. }
  236. /**
  237. * Get_Absolute_File_Name
  238. *
  239. * @param fileName {required}
  240. * @return string
  241. * @api public
  242. */
  243. exports.getAbsoluteFileName = function(dir,name){
  244. if(name.length < dir.length){
  245. throw new Error('file path must be longger than dir path');
  246. }
  247. for(var i=0;i<name.length;i++){
  248. if(dir[i] != name[i]){
  249. return name.substr(i);
  250. }
  251. }
  252. }