Skip to content

Commit 1b2a107

Browse files
committed
0.0.6
1 parent e992b2e commit 1b2a107

File tree

7 files changed

+321
-111
lines changed

7 files changed

+321
-111
lines changed

History.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
0.0.6 / 2012-12-20
2+
==================
3+
4+
* #6 hostname option added
5+
* upload.fileManager() added, which allows moving file
6+
17
0.0.5 / 2012-12-12
28
==================
39

README.md

+74-16
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,74 @@ Dynamic upload directory and url, isolating user files:
113113
});
114114
```
115115

116-
Getting uploaded files mapped to their fs locations:
116+
Moving uploaded files to different dir:
117117

118118
```javascript
119-
app.use('/list', function (req, res, next) {
120-
upload.getFiles({
121-
uploadDir: function () {
122-
return __dirname + '/public/uploads/' + req.sessionID
119+
app.use('/api', function (req, res, next) {
120+
req.filemanager = upload.fileManager();
121+
next();
122+
});
123+
124+
app.use('/api/endpoint', function (req, res, next) {
125+
// your real /api handler that will actually move the file
126+
...
127+
// req.filemanager.move(filename, path, function (err, result))
128+
req.filemanager.move('SomeFile.jpg', 'project1', function (err, result) {
129+
// SomeFile.jpg gets moved from uploadDir/SomeFile.jpg to
130+
// uploadDir/project1/SomeFile.jpg
131+
// if path is relative (no leading slash), uploadUrl will
132+
// be used to generate relevant urls,
133+
// for absolute paths urls are not generated
134+
if (!err) {
135+
// result structure
136+
// {
137+
// filename: 'SomeFile.jpg',
138+
// url: '/uploads/project1/SomeFile.jpg',
139+
// thumbail_url : '/uploads/project1/thumbnail/SomeFile.jpg'
140+
// }
141+
...
142+
} else {
143+
console.log(err);
144+
}
145+
});
146+
});
147+
```
148+
149+
Moving uploaded files out of uploadDir:
150+
151+
```
152+
app.use('/api', function (req, res, next) {
153+
var user = db.find(...);
154+
155+
req.filemanager = upload.fileManager({
156+
targetDir: __dirname + '/public/u/' + user._id,
157+
targetUrl: '/u/' + user._id,
158+
});
159+
160+
// or
161+
req.filemanager = upload.fileManager({
162+
targetDir: function () {
163+
return __dirname + '/public/u/' + user._id
123164
},
124-
uploadUrl: function () {
125-
return '/uploads/' + req.sessionID
165+
targetUrl: function () {
166+
return'/u/' + user._id
167+
}
168+
});
169+
...
170+
req.filemanager.move(req.body.filename, 'profile', function (err, result) {
171+
// file gets moved to __dirname + '/public/u/' + user._id + '/profile'
172+
if (!err) {
173+
126174
}
127-
}, function (files) {
175+
});
176+
});
177+
```
178+
179+
Getting uploaded files mapped to their fs locations:
180+
181+
```javascript
182+
app.use('/list', function (req, res, next) {
183+
upload.fileManager().getFiles(function (files) {
128184
// {
129185
// "00001.MTS": {
130186
// "path": "/home/.../public/uploads/ekE6k4j9PyrGtcg+SA6a5za3/00001.MTS"
@@ -137,22 +193,19 @@ Getting uploaded files mapped to their fs locations:
137193
res.json(files);
138194
});
139195
});
140-
```
141196

142-
Passing uploaded files down the request chain:
197+
// with dynamic upload directories
143198

144-
```javascript
145-
app.use('/api', function (req, res, next) {
146-
upload.getFiles({
199+
app.use('/list', function (req, res, next) {
200+
upload.fileManager({
147201
uploadDir: function () {
148202
return __dirname + '/public/uploads/' + req.sessionID
149203
},
150204
uploadUrl: function () {
151205
return '/uploads/' + req.sessionID
152206
}
153-
}, function (files) {
154-
res.jquploadfiles = files;
155-
next();
207+
}).getFiles(function (files) {
208+
res.json(files);
156209
});
157210
});
158211
```
@@ -164,6 +217,11 @@ Other options and their default values:
164217
tmpDir: '/tmp',
165218
uploadDir: __dirname + '/public/uploads',
166219
uploadUrl: '/uploads',
220+
targetDir: uploadDir,
221+
targetUrl: uploadUrl,
222+
ssl: false,
223+
hostname: null, // in case your reverse proxy doesn't set Host header
224+
// eg 'google.com'
167225
maxPostSize: 11000000000, // 11 GB
168226
minFileSize: 1,
169227
maxFileSize: 10000000000, // 10 GB

index.js

+4-92
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,6 @@
11
var _ = require('lodash'),
2-
fs = require('fs');
2+
EventEmitter = require('events').EventEmitter;
33

4-
var FileHandler = function (middleware, options, callback) {
5-
6-
return function (req, res, next) {
7-
res.set({
8-
'Access-Control-Allow-Origin': options.accessControl.allowOrigin,
9-
'Access-Control-Allow-Methods': options.accessControl.allowMethods
10-
});
11-
var UploadHandler = require('./lib/uploadhandler')(options);
12-
var handler = new UploadHandler(req, res, function (result, redirect) {
13-
if (redirect) {
14-
res.redirect(redirect.replace(/%s/, encodeURIComponent(JSON.stringify(result))));
15-
} else {
16-
res.set({
17-
'Content-Type': (req.headers.accept || '').indexOf('application/json') !== -1
18-
? 'application/json'
19-
: 'text/plain'
20-
});
21-
res.json(200, result);
22-
}
23-
});
24-
25-
handler.on('begin', function (fileInfo) {
26-
middleware.emit('begin', fileInfo);
27-
});
28-
handler.on('end', function (fileInfo) {
29-
middleware.emit('end', fileInfo);
30-
});
31-
handler.on('abort', function (fileInfo) {
32-
middleware.emit('abort', fileInfo);
33-
});
34-
handler.on('error', function (e) {
35-
middleware.emit('abort', e);
36-
});
37-
38-
switch (req.method) {
39-
case 'OPTIONS':
40-
res.end();
41-
break;
42-
case 'HEAD':
43-
case 'GET':
44-
handler.get();
45-
break;
46-
case 'POST':
47-
handler.post();
48-
break;
49-
case 'DELETE':
50-
handler.destroy();
51-
break;
52-
default:
53-
res.send(405);
54-
}
55-
}
56-
};
57-
58-
var EventEmitter = require('events').EventEmitter;
594
var JqueryFileUploadMiddleware = function () {
605
EventEmitter.call(this);
616
// setting default options
@@ -102,44 +47,11 @@ JqueryFileUploadMiddleware.prototype.configure = function (options) {
10247
};
10348

10449
JqueryFileUploadMiddleware.prototype.fileHandler = function (options) {
105-
return FileHandler(this, this.prepareOptions(_.extend( this.options, options )));
50+
return require('./lib/filehandler')(this, this.prepareOptions(_.extend(this.options, options)));
10651
};
10752

108-
JqueryFileUploadMiddleware.prototype.getFiles = function (options, callback) {
109-
if (_.isFunction(options)) {
110-
callback = options;
111-
options = this.options;
112-
} else {
113-
options = this.prepareOptions(_.extend( this.options, options ));
114-
}
115-
116-
var files = {};
117-
var counter = 1;
118-
var finish = function () {
119-
if (!--counter)
120-
callback(files);
121-
};
122-
123-
fs.readdir(options.uploadDir(), _.bind(function (err, list) {
124-
_.each(list, function (name) {
125-
var stats = fs.statSync(options.uploadDir() + '/' + name);
126-
if (stats.isFile()) {
127-
files[name] = {
128-
path: options.uploadDir() + '/' + name
129-
};
130-
_.each(options.imageVersions, function (value, version) {
131-
counter++;
132-
fs.exists(options.uploadDir() + '/' + version + '/' + name, function (exists) {
133-
if (exists)
134-
files[name][version] = options.uploadDir() + '/' + version + '/' + name;
135-
finish();
136-
});
137-
});
138-
}
139-
}, this);
140-
finish();
141-
}, this));
53+
JqueryFileUploadMiddleware.prototype.fileManager = function (options) {
54+
return require('./lib/filemanager')(this, this.prepareOptions(_.extend(this.options, options)));
14255
};
14356

14457
module.exports = new JqueryFileUploadMiddleware();
145-

lib/filehandler.js

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
module.exports = function (middleware, options) {
2+
3+
return function (req, res, next) {
4+
res.set({
5+
'Access-Control-Allow-Origin': options.accessControl.allowOrigin,
6+
'Access-Control-Allow-Methods': options.accessControl.allowMethods
7+
});
8+
var UploadHandler = require('./uploadhandler')(options);
9+
var handler = new UploadHandler(req, res, function (result, redirect) {
10+
if (redirect) {
11+
res.redirect(redirect.replace(/%s/, encodeURIComponent(JSON.stringify(result))));
12+
} else {
13+
res.set({
14+
'Content-Type': (req.headers.accept || '').indexOf('application/json') !== -1
15+
? 'application/json'
16+
: 'text/plain'
17+
});
18+
res.json(200, result);
19+
}
20+
});
21+
22+
handler.on('begin', function (fileInfo) {
23+
middleware.emit('begin', fileInfo);
24+
});
25+
handler.on('end', function (fileInfo) {
26+
middleware.emit('end', fileInfo);
27+
});
28+
handler.on('abort', function (fileInfo) {
29+
middleware.emit('abort', fileInfo);
30+
});
31+
handler.on('error', function (e) {
32+
middleware.emit('abort', e);
33+
});
34+
35+
switch (req.method) {
36+
case 'OPTIONS':
37+
res.end();
38+
break;
39+
case 'HEAD':
40+
case 'GET':
41+
handler.get();
42+
break;
43+
case 'POST':
44+
handler.post();
45+
break;
46+
case 'DELETE':
47+
handler.destroy();
48+
break;
49+
default:
50+
res.send(405);
51+
}
52+
}
53+
};

0 commit comments

Comments
 (0)