From 3b8fe1c59567214962a7f5df651b21e837f5e6e6 Mon Sep 17 00:00:00 2001 From: zysoft Date: Tue, 22 May 2018 15:08:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BB=A5hash=E5=80=BC=E5=91=BD=E5=90=8D=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 25 ---------- lib/uploadhandler.js | 115 ++++++++++++++++++++++++++++++++++++------- package.json | 60 ++++++++++++++++------ 3 files changed, 141 insertions(+), 59 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 0ca9404..0000000 --- a/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -### intellij ### -*.iml -*.ipr -*.iws -.idea/ - -### node ### -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -npm-debug.log -node_modules - -### example ### -public/lib/ \ No newline at end of file diff --git a/lib/uploadhandler.js b/lib/uploadhandler.js index 591aae0..d1c613b 100644 --- a/lib/uploadhandler.js +++ b/lib/uploadhandler.js @@ -6,9 +6,67 @@ var EventEmitter = require('events').EventEmitter, mkdirp = require('mkdirp'), _ = require('lodash'), async = require('async'); + crypto = require('crypto'); var doNothing=function(){}; module.exports = function (options) { + var getFiles = function (callback) { + var files = {}; + var counter = 1; + var finish = function () { + if (!--counter) + callback(files); + }; + + fs.readdir(options.uploadDir(), _.bind(function (err, list) { + // console.log(list);//子目录 + _.each(list, function (dir) { + const subDir = options.uploadDir() + '/' + dir; + fs.readdir(subDir, _.bind(function (err, _list) { + _.each(_list, function (name) { + var stats = fs.statSync(subDir + '/' + name); + if (stats.isFile()) { + files[name] = { + path: subDir + '/' + name + }; + _.each(options.imageVersions, function (value, version) { + counter++; + fs.exists(options.uploadDir() + '/' + version + '/' + name, function (exists) { + if (exists) + files[name][version] = options.uploadDir() + '/' + version + '/' + name; + finish(); + }); + }); + } + }); + finish(); + })) + }, this); + // finish(); + }, this)); + return files; + }; + + var getHash = function (filePath, callback) { + var is = fs.createReadStream(filePath); + const hash = crypto.createHash('sha1'); + is.on('data', function (data) { + hash.update(data); + }); + is.on('end', function (err) { + if (!err) { + const sha1 = hash.digest('hex'); + callback(sha1); + } + }); + } + + var isFileExist = function (fileName, callback) { + getFiles(function (files) { + const fileNames = Object.keys(files); + callback(_.includes(fileNames, fileName)); + }) + } var FileInfo = require('./fileinfo')( _.extend({ @@ -128,7 +186,7 @@ module.exports = function (options) { imageMagick.resize({ width: opts.width, height: opts.height, - srcPath: options.uploadDir() + '/' + fileInfo.name, + srcPath: options.uploadDir() + '/' + fileInfo.fileDir + '/' + fileInfo.name, dstPath: options.uploadDir() + '/' + version + '/' + fileInfo.name, customArgs: opts.imageArgs || ['-auto-orient'] }, finish); @@ -138,22 +196,43 @@ module.exports = function (options) { } mkdirp(options.uploadDir() + '/', function(err, made) { - fs.rename(file.path, options.uploadDir() + '/' + fileInfo.name, function (err) { - if (!err) { - generatePreviews(); - finish(); - } else { - var is = fs.createReadStream(file.path); - var os = fs.createWriteStream(options.uploadDir() + '/' + fileInfo.name); - is.on('end', function (err) { - if (!err) { - fs.unlink(file.path); - generatePreviews(); - } + //文件后缀 + const fileSuffix = fileInfo.name.substring(fileInfo.name.lastIndexOf('.')); + + getHash(file.path, function (hash) { + const fileName = hash + fileSuffix; + //子目录 + const fileDir = fileName.substring(0,2); + fileInfo.fileDir = fileDir; + fileInfo.name = fileName; + + isFileExist(fileName, function (isExist) { + if(isExist) { finish(); + return; + } + + mkdirp(options.uploadDir() + '/' + fileDir + '/', function(err, made_1) { + const new_path = options.uploadDir() + '/' + fileDir + '/' + fileName; + fs.rename(file.path, new_path, function (err) { + if (!err) { + generatePreviews(); + finish(); + } else { + var is = fs.createReadStream(file.path); + var os = fs.createWriteStream(new_path); + is.on('end', function (err) { + if (!err) { + fs.unlink(file.path); + generatePreviews(); + } + finish(); + }); + is.pipe(os); + } + }); }); - is.pipe(os); - } + }); }); }); } @@ -199,11 +278,11 @@ module.exports = function (options) { UploadHandler.prototype.initUrls = function (fileInfo, cb) { var baseUrl = (options.ssl ? 'https:' : 'http:') + '//' + (options.hostname || this.req.get('Host')); - fileInfo.setUrl(null, baseUrl + options.uploadUrl()); - fileInfo.setUrl('delete', baseUrl + this.req.originalUrl); + fileInfo.setUrl(null, baseUrl + options.uploadUrl() + '/' + fileInfo.fileDir); + fileInfo.setUrl('delete', baseUrl + this.req.originalUrl + '/' + fileInfo.fileDir); async.each(Object.keys(options.imageVersions), function(version, cb) { fs.exists(options.uploadDir() + '/' + version + '/' + fileInfo.name, function(exists) { - if (exists) fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version); + if (exists) fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version + '/'); cb(null); }) }, diff --git a/package.json b/package.json index dc11e0c..3cbafe5 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,62 @@ { - "name": "jquery-file-upload-middleware", - "author": "Aleksandr Guidrevitch ", - "description": "jQuery-File-Upload Express.js Middleware", - "keywords": [ - "jquery", - "upload", - "express", - "middleware" + "_from": "github:fangj/jquery-file-upload-middleware", + "_id": "jquery-file-upload-middleware@0.1.7", + "_inBundle": false, + "_location": "/jquery-file-upload-middleware", + "_phantomChildren": {}, + "_requested": { + "type": "git", + "raw": "jquery-file-upload-middleware@github:fangj/jquery-file-upload-middleware", + "name": "jquery-file-upload-middleware", + "escapedName": "jquery-file-upload-middleware", + "rawSpec": "github:fangj/jquery-file-upload-middleware", + "saveSpec": "github:fangj/jquery-file-upload-middleware", + "fetchSpec": null, + "gitCommittish": null + }, + "_requiredBy": [ + "/" ], - "version": "0.1.7", + "_resolved": "github:fangj/jquery-file-upload-middleware#999e430e5f207bc2ae8ded31b1b54d538cb95dab", + "_spec": "jquery-file-upload-middleware@github:fangj/jquery-file-upload-middleware", + "_where": "D:\\project\\lims_next_x1\\extra\\file_service", + "author": { + "name": "Aleksandr Guidrevitch", + "email": "aguidrevitch@gmail.com" + }, + "bugs": { + "url": "https://github.com/aguidrevitch/jquery-file-upload-middleware/issues" + }, + "bundleDependencies": false, "dependencies": { + "async": "*", "formidable": ">=1.0.11", "imagemagick": ">=0.1.2", "lodash": ">= 0.9.2", - "mkdirp": ">= 0.3.4", - "async": "*" + "mkdirp": ">= 0.3.4" }, + "deprecated": false, + "description": "jQuery-File-Upload Express.js Middleware", + "devDependencies": {}, "engines": { "node": ">= 0.8.8" }, + "homepage": "https://github.com/aguidrevitch/jquery-file-upload-middleware#readme", + "keywords": [ + "jquery", + "upload", + "express", + "middleware" + ], + "license": "MIT", + "main": "./index.js", + "name": "jquery-file-upload-middleware", "repository": { "type": "git", "url": "git://github.com/aguidrevitch/jquery-file-upload-middleware.git" }, - "main": "./index.js", - "readmeFilename": "README.md", - "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "_id": "jquery-file-upload-middleware@0.1.7", - "license": "MIT" + "version": "0.1.7" } From 9e9bcf6ebe8cd03554c8b3239c5ad43361ea95c6 Mon Sep 17 00:00:00 2001 From: zysoft Date: Thu, 31 May 2018 11:16:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AE=80=E5=8C=96hash=E5=92=8C=E6=9F=A5?= =?UTF-8?q?=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/uploadhandler.js | 118 ++++++++++++------------------------------- 1 file changed, 31 insertions(+), 87 deletions(-) diff --git a/lib/uploadhandler.js b/lib/uploadhandler.js index d1c613b..0007593 100644 --- a/lib/uploadhandler.js +++ b/lib/uploadhandler.js @@ -10,64 +10,6 @@ var EventEmitter = require('events').EventEmitter, var doNothing=function(){}; module.exports = function (options) { - var getFiles = function (callback) { - var files = {}; - var counter = 1; - var finish = function () { - if (!--counter) - callback(files); - }; - - fs.readdir(options.uploadDir(), _.bind(function (err, list) { - // console.log(list);//子目录 - _.each(list, function (dir) { - const subDir = options.uploadDir() + '/' + dir; - fs.readdir(subDir, _.bind(function (err, _list) { - _.each(_list, function (name) { - var stats = fs.statSync(subDir + '/' + name); - if (stats.isFile()) { - files[name] = { - path: subDir + '/' + name - }; - _.each(options.imageVersions, function (value, version) { - counter++; - fs.exists(options.uploadDir() + '/' + version + '/' + name, function (exists) { - if (exists) - files[name][version] = options.uploadDir() + '/' + version + '/' + name; - finish(); - }); - }); - } - }); - finish(); - })) - }, this); - // finish(); - }, this)); - return files; - }; - - var getHash = function (filePath, callback) { - var is = fs.createReadStream(filePath); - const hash = crypto.createHash('sha1'); - is.on('data', function (data) { - hash.update(data); - }); - is.on('end', function (err) { - if (!err) { - const sha1 = hash.digest('hex'); - callback(sha1); - } - }); - } - - var isFileExist = function (fileName, callback) { - getFiles(function (files) { - const fileNames = Object.keys(files); - callback(_.includes(fileNames, fileName)); - }) - } - var FileInfo = require('./fileinfo')( _.extend({ baseDir: options.uploadDir @@ -122,6 +64,10 @@ module.exports = function (options) { }, this)); }; + var isFileExist = function (filePath) { + return fs.existsSync(filePath); + } + UploadHandler.prototype.post = function () { var self = this, form = new formidable.IncomingForm(), @@ -147,6 +93,7 @@ module.exports = function (options) { this.noCache(); form.uploadDir = options.tmpDir; + form.hash = "sha1"; form .on('fileBegin', function (name, file) { tmpFiles.push(file.path); @@ -198,40 +145,37 @@ module.exports = function (options) { mkdirp(options.uploadDir() + '/', function(err, made) { //文件后缀 const fileSuffix = fileInfo.name.substring(fileInfo.name.lastIndexOf('.')); + const fileName = file.hash + fileSuffix; + //子目录 + const fileDir = fileName.substring(0,2); + const filePath = path.join(fileDir+fileName); + fileInfo.fileDir = fileDir; + fileInfo.name = fileName; + const isExist = isFileExist(filePath); + + if(isExist) { + finish(); + return; + } - getHash(file.path, function (hash) { - const fileName = hash + fileSuffix; - //子目录 - const fileDir = fileName.substring(0,2); - fileInfo.fileDir = fileDir; - fileInfo.name = fileName; - - isFileExist(fileName, function (isExist) { - if(isExist) { + mkdirp(path.join(options.uploadDir(),fileDir), function(err, made_1) { + const new_path = path.join(options.uploadDir(),fileDir,fileName); + fs.rename(file.path, new_path, function (err) { + if (!err) { + generatePreviews(); finish(); - return; - } - - mkdirp(options.uploadDir() + '/' + fileDir + '/', function(err, made_1) { - const new_path = options.uploadDir() + '/' + fileDir + '/' + fileName; - fs.rename(file.path, new_path, function (err) { + } else { + var is = fs.createReadStream(file.path); + var os = fs.createWriteStream(new_path); + is.on('end', function (err) { if (!err) { + fs.unlink(file.path); generatePreviews(); - finish(); - } else { - var is = fs.createReadStream(file.path); - var os = fs.createWriteStream(new_path); - is.on('end', function (err) { - if (!err) { - fs.unlink(file.path); - generatePreviews(); - } - finish(); - }); - is.pipe(os); } + finish(); }); - }); + is.pipe(os); + } }); }); }); @@ -282,7 +226,7 @@ module.exports = function (options) { fileInfo.setUrl('delete', baseUrl + this.req.originalUrl + '/' + fileInfo.fileDir); async.each(Object.keys(options.imageVersions), function(version, cb) { fs.exists(options.uploadDir() + '/' + version + '/' + fileInfo.name, function(exists) { - if (exists) fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version + '/'); + if (exists) fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version); cb(null); }) },