Skip to content

Commit 78d380d

Browse files
committed
Adds content type support in S3
1 parent 9287afc commit 78d380d

File tree

6 files changed

+22
-13
lines changed

6 files changed

+22
-13
lines changed

spec/FilesController.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ var FCTestFactory = require("./FilesControllerTestFactory");
1010
describe("FilesController",()=>{
1111

1212
// Test the grid store adapter
13-
var gridStoreAdapter = new GridStoreAdapter();
13+
var gridStoreAdapter = new GridStoreAdapter('mongodb://localhost:27017/parse');
1414
FCTestFactory.testAdapter("GridStoreAdapter", gridStoreAdapter);
1515

1616
if (process.env.S3_ACCESS_KEY && process.env.S3_SECRET_KEY) {

src/Adapters/Files/FilesAdapter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// database adapter.
1313

1414
export class FilesAdapter {
15-
createFile(config, filename, data) { }
15+
createFile(config, filename: string, data, contentType: string) { }
1616

1717
deleteFile(config, filename) { }
1818

src/Adapters/Files/GridStoreAdapter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class GridStoreAdapter extends FilesAdapter {
2828

2929
// For a given config object, filename, and data, store a file
3030
// Returns a promise
31-
createFile(config, filename: string, data) {
31+
createFile(config, filename: string, data, contentType: string) {
3232
return this._connect().then(database => {
3333
let gridStore = new GridStore(database, filename, 'w');
3434
return gridStore.open();

src/Adapters/Files/S3Adapter.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,17 @@ export class S3Adapter extends FilesAdapter {
6868

6969
// For a given config object, filename, and data, store a file in S3
7070
// Returns a promise containing the S3 object creation response
71-
createFile(config, filename, data) {
71+
createFile(config, filename, data, contentType) {
7272
let params = {
7373
Key: this._bucketPrefix + filename,
7474
Body: data
7575
};
7676
if (this._directAccess) {
7777
params.ACL = "public-read"
7878
}
79+
if (contentType) {
80+
params.ContentType = contentType;
81+
}
7982
return this.createBucket().then(() => {
8083
return new Promise((resolve, reject) => {
8184
this._s3Client.upload(params, (err, data) => {

src/Controllers/FilesController.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ export class FilesController extends AdaptableController {
1010
return this.adapter.getFileData(config, filename);
1111
}
1212

13-
createFile(config, filename, data) {
13+
createFile(config, filename, data, contentType) {
1414
filename = randomHexString(32) + '_' + filename;
1515
var location = this.adapter.getFileLocation(config, filename);
16-
return this.adapter.createFile(config, filename, data).then(() => {
16+
return this.adapter.createFile(config, filename, data, contentType).then(() => {
1717
return Promise.resolve({
1818
url: location,
1919
name: filename

src/Routers/FilesRouter.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as Middlewares from '../middlewares';
44
import { randomHexString } from '../cryptoUtils';
55
import mime from 'mime';
66
import Config from '../Config';
7+
import path from 'path';
78

89
export class FilesRouter {
910

@@ -66,20 +67,25 @@ export class FilesRouter {
6667
'Filename contains invalid characters.'));
6768
return;
6869
}
69-
let extension = '';
7070

71-
// Not very safe there.
72-
const hasExtension = req.params.filename.indexOf('.') > 0;
73-
const contentType = req.get('Content-type');
71+
let filename = req.params.filename;
72+
73+
// safe way to get the extension
74+
let extname = path.extname(filename);
75+
let contentType = req.get('Content-type');
76+
77+
const hasExtension = extname.length > 0;
78+
7479
if (!hasExtension && contentType && mime.extension(contentType)) {
75-
extension = '.' + mime.extension(contentType);
80+
filename = filename + '.' + mime.extension(contentType);
81+
} else if (hasExtension && !contentType) {
82+
contentType = mime.lookup(req.params.filename);
7683
}
7784

78-
const filename = req.params.filename + extension;
7985
const config = req.config;
8086
const filesController = config.filesController;
8187

82-
filesController.createFile(config, filename, req.body).then((result) => {
88+
filesController.createFile(config, filename, req.body, contentType).then((result) => {
8389
res.status(201);
8490
res.set('Location', result.url);
8591
res.json(result);

0 commit comments

Comments
 (0)