@@ -4,7 +4,8 @@ var EventEmitter = require('events').EventEmitter,
4
4
formidable = require ( 'formidable' ) ,
5
5
imageMagick = require ( 'imagemagick' ) ,
6
6
mkdirp = require ( 'mkdirp' ) ,
7
- _ = require ( 'lodash' ) ;
7
+ _ = require ( 'lodash' ) ,
8
+ async = require ( 'async' ) ;
8
9
9
10
module . exports = function ( options ) {
10
11
@@ -34,19 +35,24 @@ module.exports = function (options) {
34
35
this . noCache ( ) ;
35
36
var files = [ ] ;
36
37
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 ) ) ;
50
56
} , this ) ) ;
51
57
} ;
52
58
@@ -60,11 +66,15 @@ module.exports = function (options) {
60
66
redirect ,
61
67
finish = _ . bind ( function ( ) {
62
68
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 ) ) ;
68
78
}
69
79
} , this ) ;
70
80
@@ -86,56 +96,58 @@ module.exports = function (options) {
86
96
}
87
97
} )
88
98
. on ( 'file' , function ( name , file ) {
99
+ counter ++ ;
89
100
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 ;
114
108
}
115
- }
116
109
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
+ }
119
128
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 ) {
129
131
if ( ! err ) {
130
- fs . unlinkSync ( file . path ) ;
131
132
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 ) ;
132
145
}
133
- finish ( ) ;
134
146
} ) ;
135
- is . pipe ( os ) ;
136
- }
137
- } ) ;
138
- }
147
+ } ) ;
148
+ }
149
+ else finish ( ) ;
150
+ } ) ;
139
151
} )
140
152
. on ( 'aborted' , function ( ) {
141
153
_ . each ( tmpFiles , function ( file ) {
@@ -168,15 +180,17 @@ module.exports = function (options) {
168
180
} ) ;
169
181
} ;
170
182
171
- UploadHandler . prototype . initUrls = function ( fileInfo ) {
183
+ UploadHandler . prototype . initUrls = function ( fileInfo , cb ) {
172
184
var baseUrl = ( options . ssl ? 'https:' : 'http:' ) + '//' + ( options . hostname || this . req . get ( 'Host' ) ) ;
173
185
fileInfo . setUrl ( null , baseUrl + options . uploadUrl ( ) ) ;
174
186
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 ) ;
180
194
} ;
181
195
182
196
return UploadHandler ;
0 commit comments