Skip to content

Commit 4db1ec4

Browse files
committed
Merge branch 'remove-sync'
2 parents 3ea3b2b + 3135dec commit 4db1ec4

File tree

2 files changed

+83
-68
lines changed

2 files changed

+83
-68
lines changed

lib/uploadhandler.js

Lines changed: 81 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ var EventEmitter = require('events').EventEmitter,
44
formidable = require('formidable'),
55
imageMagick = require('imagemagick'),
66
mkdirp = require('mkdirp'),
7-
_ = require('lodash');
7+
_ = require('lodash'),
8+
async = require('async');
89

910
module.exports = function (options) {
1011

@@ -34,19 +35,24 @@ module.exports = function (options) {
3435
this.noCache();
3536
var files = [];
3637
fs.readdir(options.uploadDir(), _.bind(function (err, list) {
37-
_.each(list, function (name) {
38-
var stats = fs.statSync(options.uploadDir() + '/' + name),
39-
fileInfo;
40-
if (stats.isFile()) {
41-
fileInfo = new FileInfo({
42-
name: name,
43-
size: stats.size
44-
});
45-
this.initUrls(fileInfo);
46-
files.push(fileInfo);
47-
}
48-
}, this);
49-
this.callback({files: files});
38+
async.each(list, _.bind(function(name, cb) {
39+
fs.stat(options.uploadDir() + '/' + name, _.bind(function(err, stats) {
40+
if (!err && stats.isFile()) {
41+
var fileInfo = new FileInfo({
42+
name: name,
43+
size: stats.size
44+
});
45+
this.initUrls(fileInfo, function(err) {
46+
files.push(fileInfo);
47+
cb(err);
48+
});
49+
}
50+
else cb(err);
51+
}, this));
52+
}, this),
53+
_.bind(function(err) {
54+
this.callback({files: files});
55+
}, this));
5056
}, this));
5157
};
5258

@@ -60,11 +66,15 @@ module.exports = function (options) {
6066
redirect,
6167
finish = _.bind(function () {
6268
if (!--counter) {
63-
_.each(files, function (fileInfo) {
64-
this.initUrls(fileInfo);
65-
this.emit('end', fileInfo);
66-
}, this);
67-
this.callback({files: files}, redirect);
69+
async.each(files, _.bind(function(fileInfo, cb) {
70+
this.initUrls(fileInfo, _.bind(function(err) {
71+
this.emit('end', fileInfo);
72+
cb(err);
73+
}, this));
74+
}, this),
75+
_.bind(function(err) {
76+
this.callback({files: files}, redirect);
77+
}, this));
6878
}
6979
}, this);
7080

@@ -86,56 +96,58 @@ module.exports = function (options) {
8696
}
8797
})
8898
.on('file', function (name, file) {
99+
counter++;
89100
var fileInfo = map[path.basename(file.path)];
90-
if (fs.existsSync(file.path)) {
91-
fileInfo.size = file.size;
92-
if (!fileInfo.validate()) {
93-
fs.unlink(file.path);
94-
return;
95-
}
96-
97-
var generatePreviews = function () {
98-
if (options.imageTypes.test(fileInfo.name)) {
99-
_.each(options.imageVersions, function (value, version) {
100-
// creating directory recursive
101-
if (!fs.existsSync(options.uploadDir() + '/' + version + '/'))
102-
mkdirp.sync(options.uploadDir() + '/' + version + '/');
103-
104-
counter++;
105-
var opts = options.imageVersions[version];
106-
imageMagick.resize({
107-
width: opts.width,
108-
height: opts.height,
109-
srcPath: options.uploadDir() + '/' + fileInfo.name,
110-
dstPath: options.uploadDir() + '/' + version + '/' + fileInfo.name,
111-
customArgs: opts.imageArgs || ['-auto-orient']
112-
}, finish);
113-
});
101+
fs.exists(file.path, function(exists) {
102+
if (exists) {
103+
fileInfo.size = file.size;
104+
if (!fileInfo.validate()) {
105+
fs.unlink(file.path);
106+
finish();
107+
return;
114108
}
115-
}
116109

117-
if (!fs.existsSync(options.uploadDir() + '/'))
118-
mkdirp.sync(options.uploadDir() + '/');
110+
var generatePreviews = function () {
111+
if (options.imageTypes.test(fileInfo.name)) {
112+
_.each(options.imageVersions, function (value, version) {
113+
counter++;
114+
// creating directory recursive
115+
mkdirp(options.uploadDir() + '/' + version + '/', function (err, made) {
116+
var opts = options.imageVersions[version];
117+
imageMagick.resize({
118+
width: opts.width,
119+
height: opts.height,
120+
srcPath: options.uploadDir() + '/' + fileInfo.name,
121+
dstPath: options.uploadDir() + '/' + version + '/' + fileInfo.name,
122+
customArgs: opts.imageArgs || ['-auto-orient']
123+
}, finish);
124+
});
125+
});
126+
}
127+
}
119128

120-
counter++;
121-
fs.rename(file.path, options.uploadDir() + '/' + fileInfo.name, function (err) {
122-
if (!err) {
123-
generatePreviews();
124-
finish();
125-
} else {
126-
var is = fs.createReadStream(file.path);
127-
var os = fs.createWriteStream(options.uploadDir() + '/' + fileInfo.name);
128-
is.on('end', function (err) {
129+
mkdirp(options.uploadDir() + '/', function(err, made) {
130+
fs.rename(file.path, options.uploadDir() + '/' + fileInfo.name, function (err) {
129131
if (!err) {
130-
fs.unlinkSync(file.path);
131132
generatePreviews();
133+
finish();
134+
} else {
135+
var is = fs.createReadStream(file.path);
136+
var os = fs.createWriteStream(options.uploadDir() + '/' + fileInfo.name);
137+
is.on('end', function (err) {
138+
if (!err) {
139+
fs.unlink(file.path);
140+
generatePreviews();
141+
}
142+
finish();
143+
});
144+
is.pipe(os);
132145
}
133-
finish();
134146
});
135-
is.pipe(os);
136-
}
137-
});
138-
}
147+
});
148+
}
149+
else finish();
150+
});
139151
})
140152
.on('aborted', function () {
141153
_.each(tmpFiles, function (file) {
@@ -168,15 +180,17 @@ module.exports = function (options) {
168180
});
169181
};
170182

171-
UploadHandler.prototype.initUrls = function (fileInfo) {
183+
UploadHandler.prototype.initUrls = function (fileInfo, cb) {
172184
var baseUrl = (options.ssl ? 'https:' : 'http:') + '//' + (options.hostname || this.req.get('Host'));
173185
fileInfo.setUrl(null, baseUrl + options.uploadUrl());
174186
fileInfo.setUrl('delete', baseUrl + this.req.originalUrl);
175-
_.each(options.imageVersions, function (value, version) {
176-
if (fs.existsSync(options.uploadDir() + '/' + version + '/' + fileInfo.name)) {
177-
fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version);
178-
}
179-
}, this);
187+
async.each(Object.keys(options.imageVersions), function(version, cb) {
188+
fs.exists(options.uploadDir() + '/' + version + '/' + fileInfo.name, function(exists) {
189+
if (exists) fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version);
190+
cb(null);
191+
})
192+
},
193+
cb);
180194
};
181195

182196
return UploadHandler;

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"formidable": ">=1.0.11",
1414
"imagemagick": ">=0.1.2",
1515
"lodash": ">= 0.9.2",
16-
"mkdirp": ">= 0.3.4"
16+
"mkdirp": ">= 0.3.4",
17+
"async": "*"
1718
},
1819
"engines": {
1920
"node": ">= 0.8.8"

0 commit comments

Comments
 (0)