server-for-cros.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // 以下是实现跨域的服务器端示例代码:
  2. // ------------------------------------------------
  3. // nodejs API 参考:http://nodeapi.ucdok.com/#/api/
  4. // 需要本地安装 formidable ,参见 https://github.com/felixge/node-formidable
  5. var formidable = require('formidable');
  6. var http = require('http');
  7. var fs = require('fs');
  8. var url = require('url');
  9. var path = require('path');
  10. // 文件将要上传到哪个文件夹下面
  11. var uploadfoldername = 'uploadfiles';
  12. var uploadfolderpath = path.join(__dirname, uploadfoldername);
  13. // var server = '192.168.1.2';
  14. var server = 'localhost';
  15. var port = 8012;
  16. http.createServer(function (req, res) {
  17. var reqMethod = req.method.toLowerCase();
  18. // ----------------------用 '/upload' 这个路由来处理文件上传----------------------
  19. if (req.url === '/upload' && (reqMethod === 'post' || reqMethod === 'options')) {
  20. // 设置允许跨域的域名称
  21. res.setHeader("Access-Control-Allow-Origin", "http://localhost:8011");
  22. res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
  23. res.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  24. // ----- 情况1:跨域时,先发送一个options请求,此处要返回200 -----
  25. if (reqMethod === 'options') {
  26. console.log('options 请求时,返回 200');
  27. // 返回结果
  28. res.writeHead(200, {
  29. 'Content-type': 'text/html'
  30. });
  31. res.end('options OK');
  32. return;
  33. }
  34. // ----- 情况2:发送post请求,上传图片 -----
  35. console.log('定位到 /upload 路由');
  36. // 使用第三方的 formidable 插件初始化一个 form 对象
  37. var form = new formidable.IncomingForm();
  38. // 处理 request
  39. form.parse(req, function (err, fields, files) {
  40. if (err) {
  41. return console.log('formidable, form.parse err');
  42. }
  43. console.log('formidable, form.parse ok');
  44. var item;
  45. // 计算 files 长度
  46. var length = 0;
  47. for (item in files) {
  48. length++;
  49. }
  50. if (length === 0) {
  51. console.log('files no data');
  52. return;
  53. }
  54. for (item in files) {
  55. var file = files[item];
  56. // formidable 会将上传的文件存储为一个临时文件,现在获取这个文件的目录
  57. var tempfilepath = file.path;
  58. // 获取文件类型
  59. var type = file.type;
  60. // 获取文件名,并根据文件名获取扩展名
  61. var filename = file.name;
  62. var extname = filename.lastIndexOf('.') >= 0
  63. ? filename.slice(filename.lastIndexOf('.') - filename.length)
  64. : '';
  65. // 文件名没有扩展名时候,则从文件类型中取扩展名
  66. if (extname === '' && type.indexOf('/') >= 0) {
  67. extname = '.' + type.split('/')[1];
  68. }
  69. // 将文件名重新赋值为一个随机数(避免文件重名)
  70. filename = Math.random().toString().slice(2) + extname;
  71. // 构建将要存储的文件的路径
  72. var filenewpath = path.join(uploadfolderpath, filename);
  73. // 将临时文件保存为正式的文件
  74. fs.rename(tempfilepath, filenewpath, function (err) {
  75. // 存储结果
  76. var result = '';
  77. if (err) {
  78. // 发生错误
  79. console.log('fs.rename err');
  80. result = 'error|save error';
  81. } else {
  82. // 保存成功
  83. console.log('fs.rename done');
  84. // 拼接图片url地址
  85. result = 'http://' + server + ':' + port + '/' + uploadfoldername + '/' + filename;
  86. }
  87. // 返回结果
  88. res.writeHead(200, {
  89. 'Content-type': 'text/html'
  90. });
  91. res.end(result);
  92. }); // fs.rename
  93. } // for in
  94. });
  95. } else {
  96. // ---------------------- 其他路由,直接作为静态文件返回,如通过url获取图片 ----------------------
  97. var pathname = url.parse(req.url).pathname;
  98. var filepath = path.join(__dirname, pathname);
  99. fs.readFile(filepath, function (err, file) {
  100. if (err) {
  101. res.writeHead(404);
  102. console.log('response file error: ' + filepath);
  103. res.end('404 NOT FOUND...');
  104. return;
  105. }
  106. if (filepath.slice(filepath.lastIndexOf('.') - filepath.length) === '.css') {
  107. // 兼容IE
  108. res.writeHead('200', {'Content-type': 'text/css'});
  109. } else {
  110. res.writeHead('200');
  111. }
  112. console.log('response file success: ' + filepath);
  113. res.end(file);
  114. });
  115. }
  116. }).listen(port);
  117. // 监听 localhost port 端口
  118. console.log('server start at http://' + server + ':' + port);