upload.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. var fs = require('fs');
  2. var formidable = require('formidable');
  3. var linkMysql = require('./linkMysql');
  4. const uuidv1 = require('uuid/v1');
  5. module.exports = function (req, res) {
  6. var form = new formidable.IncomingForm(); //创建上传表单
  7. // 临时路径
  8. form.uploadDir = __dirname + '/../temp';
  9. // 读取formdata
  10. form.parse(req, function(err, fields, files) {
  11. // console.log(err);
  12. // console.log(fields);
  13. // console.log(files);
  14. // return
  15. if(err){
  16. console.log('fields',fields)
  17. uploadError(res, err, 501);
  18. return;
  19. }
  20. // theFile
  21. // fileName
  22. // totalSize
  23. // isFirstChunk 是否第一次上传
  24. // isLastChunk 是否最后一次上传
  25. var file = files.theFile;
  26. var fileName = fields.fileName;
  27. console.log('fileName',fileName)
  28. var fileHash = fields.fileHash;
  29. var fileChunk = fields.fileChunk;
  30. var fileSize = fields.totalSize;
  31. var isFirstChunk = isTrue(fields.isFirstChunk);
  32. var isLastChunk = isTrue(fields.isLastChunk);
  33. // 文件类型
  34. var fileType = fileName.toLowerCase().split('.').splice(-1);
  35. // 服务器名
  36. var fileServerName = uuidv1()+'.'+fileType;
  37. // if(isFirstChunk){
  38. // fileName
  39. // }
  40. // console.log(file.path)
  41. // 查询文件是否存在
  42. linkMysql.call('selectFileMsgWhereFileHash', [fileHash],function(qerr,vals,fields){
  43. if(qerr){
  44. uploadError(res, err, 401);
  45. }else{
  46. vals = vals[0][0];
  47. if(vals){//如果存在 获取文件名
  48. fileServerName = vals.FileServerName
  49. }
  50. var fileDir = __dirname + '/../upload/' + fileServerName;
  51. // 开启读取模式
  52. fs.readFile(file.path, {flag: 'r+'}, function (err, data) {
  53. if(err) {
  54. uploadError(res, err, 502);
  55. }else{
  56. // 是否第一次读取
  57. if(isFirstChunk){
  58. // 写入文件
  59. fs.writeFile(fileDir, data, {}, function (err) {
  60. if(err) {
  61. uploadError(res, err, 503);
  62. } else {
  63. // 上传成功创建文件数据
  64. linkMysql.call('addFileMsg', [fileServerName, fileName, fileType, fileHash, fileSize, (isLastChunk?'1':'0')],function(qerr,vals,fields){
  65. if(qerr){
  66. uploadError(res, err, 5031);
  67. }else{
  68. // console.log(qerr,vals,fields)
  69. uploadSuccess(res, isLastChunk, fileServerName);
  70. }
  71. })
  72. }
  73. });
  74. }else{
  75. // 追加写入文件
  76. fs.appendFile(fileDir, data, function (err) {
  77. if(err) {
  78. uploadError(res, err, 505);
  79. } else {
  80. // 上传成功修改文件数据
  81. linkMysql.call('updateFileChunk', [fileHash, fileChunk, (isLastChunk?'1':'0')], function(qerr,vals,fields){
  82. if(qerr){
  83. console.log(qerr)
  84. uploadError(res, err, 5051);
  85. }else{
  86. // console.log(qerr,vals,fields)
  87. uploadSuccess(res, isLastChunk, fileServerName);
  88. }
  89. })
  90. }
  91. });
  92. }
  93. fs.unlinkSync(file.path) // 删除临时文件
  94. }
  95. })
  96. }
  97. })
  98. })
  99. }
  100. // 判断字符串true
  101. function isTrue(t){
  102. return t === 'true'|| t === true;
  103. }
  104. /**
  105. * 打印上传成功的log并且返回状态信息
  106. * @param {[type]} res [response]
  107. * @param {Boolean} isLastChunk 是否最后一片 [string | boolean]
  108. * @param {Boolean} fileServerName 文件服务器名 [string]
  109. */
  110. function uploadSuccess(res, isLastChunk, fileServerName) {
  111. console.log(isTrue(isLastChunk)? '写入成功': '写入完毕');
  112. res.send({
  113. status:200,
  114. isLastChunk: isLastChunk,
  115. link: isLastChunk?'/uploadFile/' + fileServerName:''
  116. })
  117. }
  118. /**
  119. * 打印错误并返回
  120. * @param {[type]} res [response]
  121. * @param {[type]} err [错误信息]
  122. * @param {[type]} status [错误状态]
  123. */
  124. function uploadError(res, err, status) {
  125. console.error(err);
  126. console.log(status);
  127. res.send({status:status})
  128. }