server.js 3.7 KB

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