Skip to content

Commit dfd8a43

Browse files
committed
Added first version support for uploading to s3
1 parent efe6040 commit dfd8a43

9 files changed

+82
-10
lines changed

examples/app.js

+29-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
* */
99
var express = require('express'),
1010
http = require('http'),
11-
upload = require('../');
11+
upload = require('../'),
12+
AWS = require('aws-sdk');
1213

1314
var swig = require('swig');
1415

@@ -29,22 +30,47 @@ swig.setDefaults({
2930
cache: false // default 'memory'
3031
});
3132

33+
var varS3Region = 'THE REGION FROM AMAZON',
34+
s3Bucket = 'YOUR BUCKET NAME';
35+
AWS.config.update({
36+
"accessKeyId" : "YOUR ACCESS KEY ID",
37+
"secretAccessKey": "YOUR SECRET ACCESS KEY",
38+
"region" : varS3Region
39+
});
3240

3341
// jquery-file-upload helper
3442
app.use('/upload/default', function (req, res, next) {
3543
upload.fileHandler({
3644
tmpDir: dirs.temp,
3745
uploadDir: __dirname + dirs.default,
3846
uploadUrl: dirs.default_url,
39-
imageVersions: resizeConf.default
47+
imageVersions: resizeConf.default,
48+
s3Bucket: function () {
49+
return s3Bucket;
50+
},
51+
s3Region: function () {
52+
return varS3Region;
53+
},
54+
s3Url: function () {
55+
return dirs.default_s3_url;
56+
}
4057
})(req, res, next);
4158
});
4259

4360
app.use('/upload/location', upload.fileHandler({
4461
tmpDir: dirs.temp,
4562
uploadDir: __dirname + dirs.location,
4663
uploadUrl: dirs.location_url,
47-
imageVersions: resizeConf.location
64+
imageVersions: resizeConf.location,
65+
s3Bucket: function () {
66+
return s3Bucket;
67+
},
68+
s3Region: function () {
69+
return varS3Region;
70+
},
71+
s3Url: function () {
72+
return dirs.default_s3_url;
73+
}
4874
}));
4975

5076
app.use('/upload/location/list', function (req, res, next) {

examples/config.js

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ exports.directors = {
5050

5151
default: '/public/uploads/default',
5252
default_url: '/uploads/default',
53+
default_s3_url: '/uploads',
5354

5455
location: '/public/uploads/location',
5556
location_url: '/uploads/location'
Loading
Loading
Loading
Loading
Loading

lib/uploadhandler.js

+49-5
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ var EventEmitter = require('events').EventEmitter,
55
imageMagick = require('imagemagick'),
66
mkdirp = require('mkdirp'),
77
_ = require('lodash'),
8-
async = require('async');
8+
async = require('async'),
9+
AWS = require('aws-sdk');
910

1011
module.exports = function (options) {
1112

13+
var s3 = new AWS.S3();
14+
1215
var FileInfo = require('./fileinfo')(
1316
_.extend({
1417
baseDir: options.uploadDir
@@ -74,6 +77,7 @@ module.exports = function (options) {
7477
finish = _.bind(function () {
7578
if (!--counter) {
7679
async.each(files, _.bind(function(fileInfo, cb) {
80+
this.moveToS3(fileInfo);
7781
this.initUrls(fileInfo, _.bind(function(err) {
7882
this.emit('end', fileInfo);
7983
cb(err);
@@ -197,18 +201,58 @@ module.exports = function (options) {
197201
};
198202

199203
UploadHandler.prototype.initUrls = function (fileInfo, cb) {
200-
var baseUrl = (options.ssl ? 'https:' : 'http:') + '//' + (options.hostname || this.req.get('Host'));
201-
fileInfo.setUrl(null, baseUrl + options.uploadUrl());
202-
fileInfo.setUrl('delete', baseUrl + this.req.originalUrl);
204+
//http://<<bucket>>.s3-<<region>>.amazonaws.com
205+
var baseUrl = (options.ssl ? 'https:' : 'http:') + '//' + options.s3Bucket() + '.s3-' + options.s3Region() + '.amazonaws.com';
206+
fileInfo.setUrl(null, baseUrl + options.s3Url());
207+
fileInfo.setUrl('delete', baseUrl + this.req.s3Url);
203208
async.each(Object.keys(options.imageVersions), function(version, cb) {
204209
fs.exists(options.uploadDir() + '/' + version + '/' + fileInfo.name, function(exists) {
205-
if (exists) fileInfo.setUrl(version, baseUrl + options.uploadUrl() + '/' + version);
210+
if (exists) fileInfo.setUrl(version, baseUrl + options.s3Url() + '/' + version);
206211
cb(null);
207212
})
208213
},
209214
cb);
210215
};
211216

217+
UploadHandler.prototype.moveToS3 = function(fileInfo) {
218+
var fileName = options.uploadDir() + '/' + fileInfo.name;
219+
fs.readFile(fileName, _.bind(function(err, data) {
220+
if(!err) {
221+
this.uploadToS3(options.s3Url() + '/' + fileInfo.name, data);
222+
223+
async.each(Object.keys(options.imageVersions), _.bind(function(version) {
224+
fileName = options.uploadDir() + '/' + version + '/' + fileInfo.name;
225+
fs.readFile(fileName, _.bind(function(err, data) {
226+
if(!err) {
227+
this.uploadToS3(options.s3Url() + '/' + version + '/' + fileInfo.name, data);
228+
}
229+
}, this));
230+
}, this));
231+
}
232+
}, this));
233+
};
234+
235+
UploadHandler.prototype.uploadToS3 = function(fileName, data) {
236+
fs.unlink(fileName, _.bind(function(err){
237+
this.emit('error', err);
238+
}, this));
239+
240+
var bucket = options.s3Bucket();
241+
s3.createBucket({Bucket: bucket}, _.bind(function() {
242+
var params = {
243+
Bucket: bucket,
244+
Key: fileName,
245+
Body: data,ACL:'public-read'
246+
};
247+
s3.putObject(params, _.bind(function(err, data) {
248+
console.log(err);
249+
if (err) {
250+
this.emit('error', err);
251+
}
252+
}, this));
253+
}, this));
254+
};
255+
212256
return UploadHandler;
213257
}
214258

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@
1010
],
1111
"version": "0.1.7",
1212
"dependencies": {
13+
"async": "*",
14+
"aws-sdk": "^2.0.17",
1315
"formidable": ">=1.0.11",
1416
"imagemagick": ">=0.1.2",
1517
"lodash": ">= 0.9.2",
16-
"mkdirp": ">= 0.3.4",
17-
"async": "*"
18+
"mkdirp": ">= 0.3.4"
1819
},
1920
"engines": {
2021
"node": ">= 0.8.8"

0 commit comments

Comments
 (0)