diff --git a/spec/FilesController.spec.js b/spec/FilesController.spec.js index 13a443d8..2306676e 100644 --- a/spec/FilesController.spec.js +++ b/spec/FilesController.spec.js @@ -10,7 +10,7 @@ var FCTestFactory = require("./FilesControllerTestFactory"); describe("FilesController",()=>{ // Test the grid store adapter - var gridStoreAdapter = new GridStoreAdapter(); + var gridStoreAdapter = new GridStoreAdapter('mongodb://localhost:27017/parse'); FCTestFactory.testAdapter("GridStoreAdapter", gridStoreAdapter); if (process.env.S3_ACCESS_KEY && process.env.S3_SECRET_KEY) { diff --git a/src/Adapters/Files/FilesAdapter.js b/src/Adapters/Files/FilesAdapter.js index 2ff9fdb2..1ddfbabb 100644 --- a/src/Adapters/Files/FilesAdapter.js +++ b/src/Adapters/Files/FilesAdapter.js @@ -12,7 +12,7 @@ // database adapter. export class FilesAdapter { - createFile(config, filename, data) { } + createFile(config, filename: string, data, contentType: string) { } deleteFile(config, filename) { } diff --git a/src/Adapters/Files/GridStoreAdapter.js b/src/Adapters/Files/GridStoreAdapter.js index b95f5563..ee5cf3ab 100644 --- a/src/Adapters/Files/GridStoreAdapter.js +++ b/src/Adapters/Files/GridStoreAdapter.js @@ -28,7 +28,7 @@ export class GridStoreAdapter extends FilesAdapter { // For a given config object, filename, and data, store a file // Returns a promise - createFile(config, filename: string, data) { + createFile(config, filename: string, data, contentType: string) { return this._connect().then(database => { let gridStore = new GridStore(database, filename, 'w'); return gridStore.open(); diff --git a/src/Adapters/Files/S3Adapter.js b/src/Adapters/Files/S3Adapter.js index 4acddf6b..e21ef8db 100644 --- a/src/Adapters/Files/S3Adapter.js +++ b/src/Adapters/Files/S3Adapter.js @@ -68,7 +68,7 @@ export class S3Adapter extends FilesAdapter { // For a given config object, filename, and data, store a file in S3 // Returns a promise containing the S3 object creation response - createFile(config, filename, data) { + createFile(config, filename, data, contentType) { let params = { Key: this._bucketPrefix + filename, Body: data @@ -76,6 +76,9 @@ export class S3Adapter extends FilesAdapter { if (this._directAccess) { params.ACL = "public-read" } + if (contentType) { + params.ContentType = contentType; + } return this.createBucket().then(() => { return new Promise((resolve, reject) => { this._s3Client.upload(params, (err, data) => { diff --git a/src/Controllers/FilesController.js b/src/Controllers/FilesController.js index 9634d807..78086758 100644 --- a/src/Controllers/FilesController.js +++ b/src/Controllers/FilesController.js @@ -10,10 +10,10 @@ export class FilesController extends AdaptableController { return this.adapter.getFileData(config, filename); } - createFile(config, filename, data) { + createFile(config, filename, data, contentType) { filename = randomHexString(32) + '_' + filename; var location = this.adapter.getFileLocation(config, filename); - return this.adapter.createFile(config, filename, data).then(() => { + return this.adapter.createFile(config, filename, data, contentType).then(() => { return Promise.resolve({ url: location, name: filename diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 65da555f..5c82d7cc 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -4,6 +4,7 @@ import * as Middlewares from '../middlewares'; import { randomHexString } from '../cryptoUtils'; import mime from 'mime'; import Config from '../Config'; +import path from 'path'; export class FilesRouter { @@ -66,20 +67,25 @@ export class FilesRouter { 'Filename contains invalid characters.')); return; } - let extension = ''; - // Not very safe there. - const hasExtension = req.params.filename.indexOf('.') > 0; - const contentType = req.get('Content-type'); + let filename = req.params.filename; + + // safe way to get the extension + let extname = path.extname(filename); + let contentType = req.get('Content-type'); + + const hasExtension = extname.length > 0; + if (!hasExtension && contentType && mime.extension(contentType)) { - extension = '.' + mime.extension(contentType); + filename = filename + '.' + mime.extension(contentType); + } else if (hasExtension && !contentType) { + contentType = mime.lookup(req.params.filename); } - const filename = req.params.filename + extension; const config = req.config; const filesController = config.filesController; - filesController.createFile(config, filename, req.body).then((result) => { + filesController.createFile(config, filename, req.body, contentType).then((result) => { res.status(201); res.set('Location', result.url); res.json(result);