@@ -6,9 +6,67 @@ var EventEmitter = require('events').EventEmitter,
6
6
mkdirp = require ( 'mkdirp' ) ,
7
7
_ = require ( 'lodash' ) ,
8
8
async = require ( 'async' ) ;
9
+ crypto = require ( 'crypto' ) ;
9
10
var doNothing = function ( ) { } ;
10
11
11
12
module . exports = function ( options ) {
13
+ var getFiles = function ( callback ) {
14
+ var files = { } ;
15
+ var counter = 1 ;
16
+ var finish = function ( ) {
17
+ if ( ! -- counter )
18
+ callback ( files ) ;
19
+ } ;
20
+
21
+ fs . readdir ( options . uploadDir ( ) , _ . bind ( function ( err , list ) {
22
+ // console.log(list);//子目录
23
+ _ . each ( list , function ( dir ) {
24
+ const subDir = options . uploadDir ( ) + '/' + dir ;
25
+ fs . readdir ( subDir , _ . bind ( function ( err , _list ) {
26
+ _ . each ( _list , function ( name ) {
27
+ var stats = fs . statSync ( subDir + '/' + name ) ;
28
+ if ( stats . isFile ( ) ) {
29
+ files [ name ] = {
30
+ path : subDir + '/' + name
31
+ } ;
32
+ _ . each ( options . imageVersions , function ( value , version ) {
33
+ counter ++ ;
34
+ fs . exists ( options . uploadDir ( ) + '/' + version + '/' + name , function ( exists ) {
35
+ if ( exists )
36
+ files [ name ] [ version ] = options . uploadDir ( ) + '/' + version + '/' + name ;
37
+ finish ( ) ;
38
+ } ) ;
39
+ } ) ;
40
+ }
41
+ } ) ;
42
+ finish ( ) ;
43
+ } ) )
44
+ } , this ) ;
45
+ // finish();
46
+ } , this ) ) ;
47
+ return files ;
48
+ } ;
49
+
50
+ var getHash = function ( filePath , callback ) {
51
+ var is = fs . createReadStream ( filePath ) ;
52
+ const hash = crypto . createHash ( 'sha1' ) ;
53
+ is . on ( 'data' , function ( data ) {
54
+ hash . update ( data ) ;
55
+ } ) ;
56
+ is . on ( 'end' , function ( err ) {
57
+ if ( ! err ) {
58
+ const sha1 = hash . digest ( 'hex' ) ;
59
+ callback ( sha1 ) ;
60
+ }
61
+ } ) ;
62
+ }
63
+
64
+ var isFileExist = function ( fileName , callback ) {
65
+ getFiles ( function ( files ) {
66
+ const fileNames = Object . keys ( files ) ;
67
+ callback ( _ . includes ( fileNames , fileName ) ) ;
68
+ } )
69
+ }
12
70
13
71
var FileInfo = require ( './fileinfo' ) (
14
72
_ . extend ( {
@@ -128,7 +186,7 @@ module.exports = function (options) {
128
186
imageMagick . resize ( {
129
187
width : opts . width ,
130
188
height : opts . height ,
131
- srcPath : options . uploadDir ( ) + '/' + fileInfo . name ,
189
+ srcPath : options . uploadDir ( ) + '/' + fileInfo . fileDir + '/' + fileInfo . name ,
132
190
dstPath : options . uploadDir ( ) + '/' + version + '/' + fileInfo . name ,
133
191
customArgs : opts . imageArgs || [ '-auto-orient' ]
134
192
} , finish ) ;
@@ -138,22 +196,43 @@ module.exports = function (options) {
138
196
}
139
197
140
198
mkdirp ( options . uploadDir ( ) + '/' , function ( err , made ) {
141
- fs . rename ( file . path , options . uploadDir ( ) + '/' + fileInfo . name , function ( err ) {
142
- if ( ! err ) {
143
- generatePreviews ( ) ;
144
- finish ( ) ;
145
- } else {
146
- var is = fs . createReadStream ( file . path ) ;
147
- var os = fs . createWriteStream ( options . uploadDir ( ) + '/' + fileInfo . name ) ;
148
- is . on ( 'end' , function ( err ) {
149
- if ( ! err ) {
150
- fs . unlink ( file . path ) ;
151
- generatePreviews ( ) ;
152
- }
199
+ //文件后缀
200
+ const fileSuffix = fileInfo . name . substring ( fileInfo . name . lastIndexOf ( '.' ) ) ;
201
+
202
+ getHash ( file . path , function ( hash ) {
203
+ const fileName = hash + fileSuffix ;
204
+ //子目录
205
+ const fileDir = fileName . substring ( 0 , 2 ) ;
206
+ fileInfo . fileDir = fileDir ;
207
+ fileInfo . name = fileName ;
208
+
209
+ isFileExist ( fileName , function ( isExist ) {
210
+ if ( isExist ) {
153
211
finish ( ) ;
212
+ return ;
213
+ }
214
+
215
+ mkdirp ( options . uploadDir ( ) + '/' + fileDir + '/' , function ( err , made_1 ) {
216
+ const new_path = options . uploadDir ( ) + '/' + fileDir + '/' + fileName ;
217
+ fs . rename ( file . path , new_path , function ( err ) {
218
+ if ( ! err ) {
219
+ generatePreviews ( ) ;
220
+ finish ( ) ;
221
+ } else {
222
+ var is = fs . createReadStream ( file . path ) ;
223
+ var os = fs . createWriteStream ( new_path ) ;
224
+ is . on ( 'end' , function ( err ) {
225
+ if ( ! err ) {
226
+ fs . unlink ( file . path ) ;
227
+ generatePreviews ( ) ;
228
+ }
229
+ finish ( ) ;
230
+ } ) ;
231
+ is . pipe ( os ) ;
232
+ }
233
+ } ) ;
154
234
} ) ;
155
- is . pipe ( os ) ;
156
- }
235
+ } ) ;
157
236
} ) ;
158
237
} ) ;
159
238
}
@@ -199,11 +278,11 @@ module.exports = function (options) {
199
278
200
279
UploadHandler . prototype . initUrls = function ( fileInfo , cb ) {
201
280
var baseUrl = ( options . ssl ? 'https:' : 'http:' ) + '//' + ( options . hostname || this . req . get ( 'Host' ) ) ;
202
- fileInfo . setUrl ( null , baseUrl + options . uploadUrl ( ) ) ;
203
- fileInfo . setUrl ( 'delete' , baseUrl + this . req . originalUrl ) ;
281
+ fileInfo . setUrl ( null , baseUrl + options . uploadUrl ( ) + '/' + fileInfo . fileDir ) ;
282
+ fileInfo . setUrl ( 'delete' , baseUrl + this . req . originalUrl + '/' + fileInfo . fileDir ) ;
204
283
async . each ( Object . keys ( options . imageVersions ) , function ( version , cb ) {
205
284
fs . exists ( options . uploadDir ( ) + '/' + version + '/' + fileInfo . name , function ( exists ) {
206
- if ( exists ) fileInfo . setUrl ( version , baseUrl + options . uploadUrl ( ) + '/' + version ) ;
285
+ if ( exists ) fileInfo . setUrl ( version , baseUrl + options . uploadUrl ( ) + '/' + version + '/' ) ;
207
286
cb ( null ) ;
208
287
} )
209
288
} ,
0 commit comments