server.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /**
  2. * Created by Marlon on 15-12-25.
  3. */
  4. const http = require('http');
  5. const querystring = require('querystring');
  6. const url = require('url');
  7. const fs = require('fs');
  8. const path = require('path');
  9. const formidable = require('formidable');
  10. const KS3 = require('ks3');
  11. const auth = require('ks3/lib/auth');
  12. const util = require('ks3/lib/util');
  13. const ROOT = '/Users/web/ks3-js/sdk/demo';
  14. const hostname = '127.0.0.1';
  15. const port = 3000;
  16. const AK = 'your Access Key'; //replace with your AK
  17. const SK = 'your secret key'; // your secret key (SK)
  18. var responseHeader = {
  19. "Access-Control-Allow-Origin": "*",
  20. "Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS",
  21. "Access-Control-Allow-Headers": "Authorization,kss-async-process,kss-notifyurl,x-kss-storage-class"
  22. };
  23. function get(req, res) {
  24. var pathname = url.parse(req.url).pathname;
  25. fs.readFile(path.join(ROOT, pathname), function (err, file) {
  26. if (err) {
  27. res.writeHead(404);
  28. res.end('找不到相关文件。 - -');
  29. return;
  30. }
  31. res.writeHead(200);
  32. res.end(file);
  33. });
  34. }
  35. function hasBody(req) {
  36. return 'transfer-encoding' in req.headers || ('content-length' in req.headers && req.headers['content-length'] !== '0');
  37. }
  38. function mime(req) {
  39. var str = req.headers['content-type'] || '';
  40. return str.split(';')[0];
  41. }
  42. //POST请求 处理函数
  43. function handle(req, res) {
  44. //TODO: not implemented
  45. }
  46. function post(req, res) {
  47. if (hasBody(req)) {
  48. var buffers = [];
  49. req.on('data', function (chunk) {
  50. buffers.push(chunk);
  51. }).on('end', function () {
  52. req.rawBody = Buffer.concat(buffers).toString();
  53. console.log('postData: ' + req.rawBody);
  54. if (mime(req) === 'application/json') {
  55. try {
  56. req.body = JSON.parse(req.rawBody);
  57. handle(req, res);
  58. } catch (e) {
  59. res.writeHead(400);
  60. req.end('Invalid JSON');
  61. return;
  62. }
  63. } else if (mime(req) === 'application/xml') {
  64. }
  65. else if (mime(req) === 'multipart/form-data') {
  66. }
  67. });
  68. } else {
  69. handle(req, res);
  70. }
  71. }
  72. function put(req, res) {
  73. var auth = req.headers['authorization'];
  74. var async_process = req.headers['kss-async-process'];
  75. var notifyurl = req.headers['kss-notifyurl'];
  76. console.log('adp: ' + async_process + '\nnotifyUrl: ' + notifyurl);
  77. if(auth !== 'KSS ' + AK){
  78. res.writeHead(403, responseHeader);
  79. res.end('Authorization not match');
  80. return;
  81. }
  82. if (hasBody(req)) {
  83. if (mime(req) === 'multipart/form-data') {
  84. var form = new formidable.IncomingForm();
  85. form.parse(req, function (err, fields, files) {
  86. req.body = fields;
  87. req.files = files; // don't forget to delete all req.files when done
  88. next(req, res);
  89. });
  90. }else{
  91. res.writeHead(400, responseHeader);
  92. res.end('mime type not match');
  93. }
  94. }else{
  95. res.writeHead(400, responseHeader);
  96. res.end('not found body');
  97. }
  98. };
  99. function next(req, res) {
  100. var bucketName = url.parse(req.url).pathname.split('/')[1];
  101. req.query = url.parse(req.url, true).query;
  102. var client = new KS3(AK, SK, bucketName);
  103. var key = req.body.key;
  104. var filePath = req.files.file.path;
  105. var outerRes = res;
  106. client.object.put({
  107. Bucket: bucketName,
  108. Key: key,
  109. filePath: filePath
  110. },
  111. function (err, data, res) {
  112. if (err) {
  113. console.log("Error in put : " + err.message);
  114. return;
  115. }
  116. console.log(JSON.stringify(res));
  117. if (res.status === 200 && res.statusCode === 200) {
  118. outerRes.writeHead(200, responseHeader);
  119. //计算处理之后的文件的signature
  120. var resource = '/' + util.encodeKey('imgWaterMark-' + key);
  121. var getReq = {
  122. method: 'GET',
  123. date: req.query.t,
  124. uri: 'http://' + bucketName + '.kss.ksyun.com' + resource,
  125. resource: '/' + bucketName + resource,
  126. headers: {}
  127. };
  128. var signature = auth.generateToken(SK, getReq);
  129. console.log('signature:' + signature);
  130. outerRes.end(signature);
  131. //下载加过水印的图片到assets目录
  132. setTimeout(getAdpResult, 2000);
  133. function getAdpResult() {
  134. client.object.get({
  135. Bucket: bucketName,
  136. Key: 'imgWaterMark-' + key
  137. }, function (err, data, res, originData) {
  138. if (err) {
  139. console.log("Error in get : " + err.message);
  140. return;
  141. }
  142. var newFileName = path.join(__dirname, 'assets/imgWaterMark-' + key);
  143. fs.writeFileSync(newFileName, originData);
  144. });
  145. }
  146. }
  147. },
  148. {
  149. 'kss-async-process': req.headers['kss-async-process'],
  150. 'kss-notifyurl': req.headers['kss-notifyurl'],
  151. 'x-kss-storage-class' : req.headers['x-kss-storage-class']
  152. });
  153. }
  154. //启动服务器
  155. var server = http.createServer(function (req, res) {
  156. //console.log( req.headers);
  157. switch (req.method) {
  158. case 'OPTIONS':
  159. res.writeHead(200, responseHeader);
  160. res.end();
  161. /*让options请求快速返回*/
  162. break;
  163. case 'POST':
  164. post(req, res);
  165. break;
  166. case 'PUT':
  167. put(req, res);
  168. break;
  169. case 'GET':
  170. default :
  171. get(req, res);
  172. }
  173. }).listen(port, hostname, function () {
  174. console.log('Server running at http://' + hostname + ':' + port + '/');
  175. });