@@ -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,12 +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
- fileInfo = _ . extend ( fileInfo , self . req . fields ) ;
66
- this . emit ( 'end' , fileInfo ) ;
67
- } , this ) ;
68
- 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 ) ) ;
69
78
}
70
79
} , this ) ;
71
80
@@ -90,56 +99,58 @@ module.exports = function (options) {
90
99
self . req . fields [ name ] = value ;
91
100
} )
92
101
. on ( 'file' , function ( name , file ) {
102
+ counter ++ ;
93
103
var fileInfo = map [ path . basename ( file . path ) ] ;
94
- if ( fs . existsSync ( file . path ) ) {
95
- fileInfo . size = file . size ;
96
- if ( ! fileInfo . validate ( ) ) {
97
- fs . unlink ( file . path ) ;
98
- return ;
99
- }
100
-
101
- var generatePreviews = function ( ) {
102
- if ( options . imageTypes . test ( fileInfo . name ) ) {
103
- _ . each ( options . imageVersions , function ( value , version ) {
104
- // creating directory recursive
105
- if ( ! fs . existsSync ( options . uploadDir ( ) + '/' + version + '/' ) )
106
- mkdirp . sync ( options . uploadDir ( ) + '/' + version + '/' ) ;
107
-
108
- counter ++ ;
109
- var opts = options . imageVersions [ version ] ;
110
- imageMagick . resize ( {
111
- width : opts . width ,
112
- height : opts . height ,
113
- srcPath : options . uploadDir ( ) + '/' + fileInfo . name ,
114
- dstPath : options . uploadDir ( ) + '/' + version + '/' + fileInfo . name ,
115
- customArgs : opts . imageArgs || [ '-auto-orient' ]
116
- } , finish ) ;
117
- } ) ;
104
+ fs . exists ( file . path , function ( exists ) {
105
+ if ( exists ) {
106
+ fileInfo . size = file . size ;
107
+ if ( ! fileInfo . validate ( ) ) {
108
+ fs . unlink ( file . path ) ;
109
+ finish ( ) ;
110
+ return ;
118
111
}
119
- }
120
112
121
- if ( ! fs . existsSync ( options . uploadDir ( ) + '/' ) )
122
- mkdirp . sync ( options . uploadDir ( ) + '/' ) ;
113
+ var generatePreviews = function ( ) {
114
+ if ( options . imageTypes . test ( fileInfo . name ) ) {
115
+ _ . each ( options . imageVersions , function ( value , version ) {
116
+ counter ++ ;
117
+ // creating directory recursive
118
+ mkdirp ( options . uploadDir ( ) + '/' + version + '/' , function ( err , made ) {
119
+ var opts = options . imageVersions [ version ] ;
120
+ imageMagick . resize ( {
121
+ width : opts . width ,
122
+ height : opts . height ,
123
+ srcPath : options . uploadDir ( ) + '/' + fileInfo . name ,
124
+ dstPath : options . uploadDir ( ) + '/' + version + '/' + fileInfo . name ,
125
+ customArgs : opts . imageArgs || [ '-auto-orient' ]
126
+ } , finish ) ;
127
+ } ) ;
128
+ } ) ;
129
+ }
130
+ }
123
131
124
- counter ++ ;
125
- fs . rename ( file . path , options . uploadDir ( ) + '/' + fileInfo . name , function ( err ) {
126
- if ( ! err ) {
127
- generatePreviews ( ) ;
128
- finish ( ) ;
129
- } else {
130
- var is = fs . createReadStream ( file . path ) ;
131
- var os = fs . createWriteStream ( options . uploadDir ( ) + '/' + fileInfo . name ) ;
132
- is . on ( 'end' , function ( err ) {
132
+ mkdirp ( options . uploadDir ( ) + '/' , function ( err , made ) {
133
+ fs . rename ( file . path , options . uploadDir ( ) + '/' + fileInfo . name , function ( err ) {
133
134
if ( ! err ) {
134
- fs . unlinkSync ( file . path ) ;
135
135
generatePreviews ( ) ;
136
+ finish ( ) ;
137
+ } else {
138
+ var is = fs . createReadStream ( file . path ) ;
139
+ var os = fs . createWriteStream ( options . uploadDir ( ) + '/' + fileInfo . name ) ;
140
+ is . on ( 'end' , function ( err ) {
141
+ if ( ! err ) {
142
+ fs . unlink ( file . path ) ;
143
+ generatePreviews ( ) ;
144
+ }
145
+ finish ( ) ;
146
+ } ) ;
147
+ is . pipe ( os ) ;
136
148
}
137
- finish ( ) ;
138
149
} ) ;
139
- is . pipe ( os ) ;
140
- }
141
- } ) ;
142
- }
150
+ } ) ;
151
+ }
152
+ else finish ( ) ;
153
+ } ) ;
143
154
} )
144
155
. on ( 'aborted' , function ( ) {
145
156
_ . each ( tmpFiles , function ( file ) {
@@ -172,15 +183,17 @@ module.exports = function (options) {
172
183
} ) ;
173
184
} ;
174
185
175
- UploadHandler . prototype . initUrls = function ( fileInfo ) {
186
+ UploadHandler . prototype . initUrls = function ( fileInfo , cb ) {
176
187
var baseUrl = ( options . ssl ? 'https:' : 'http:' ) + '//' + ( options . hostname || this . req . get ( 'Host' ) ) ;
177
188
fileInfo . setUrl ( null , baseUrl + options . uploadUrl ( ) ) ;
178
189
fileInfo . setUrl ( 'delete' , baseUrl + this . req . originalUrl ) ;
179
- _ . each ( options . imageVersions , function ( value , version ) {
180
- if ( fs . existsSync ( options . uploadDir ( ) + '/' + version + '/' + fileInfo . name ) ) {
181
- fileInfo . setUrl ( version , baseUrl + options . uploadUrl ( ) + '/' + version ) ;
182
- }
183
- } , this ) ;
190
+ async . each ( Object . keys ( options . imageVersions ) , function ( version , cb ) {
191
+ fs . exists ( options . uploadDir ( ) + '/' + version + '/' + fileInfo . name , function ( exists ) {
192
+ if ( exists ) fileInfo . setUrl ( version , baseUrl + options . uploadUrl ( ) + '/' + version ) ;
193
+ cb ( null ) ;
194
+ } )
195
+ } ,
196
+ cb ) ;
184
197
} ;
185
198
186
199
return UploadHandler ;
0 commit comments