diff --git a/package.json b/package.json index d0023df5ae..d3486d9fee 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "@types/gulp-uglify": "3.0.6", "@types/gulp-util": "3.0.34", "@types/is-root": "1.0.0", + "@types/is-svg": "3.0.0", "@types/is-url": "1.2.28", "@types/js-yaml": "3.11.4", "@types/katex": "0.5.0", @@ -136,6 +137,7 @@ "http-signature": "1.2.0", "insert-text-at-cursor": "0.1.1", "is-root": "2.0.0", + "is-svg": "3.0.0", "is-url": "1.2.4", "js-yaml": "3.12.0", "jsdom": "13.1.0", diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 2ea8cdc3bd..38b150a639 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -4,10 +4,11 @@ import * as fs from 'fs'; import * as mongodb from 'mongodb'; import * as crypto from 'crypto'; import * as debug from 'debug'; -import fileType = require('file-type'); import * as Minio from 'minio'; import * as uuid from 'uuid'; import * as sharp from 'sharp'; +import * as fileType from 'file-type'; +import * as isSvg from 'is-svg'; import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; @@ -320,6 +321,8 @@ export default async function( const type = fileType(buffer); if (type) { res([type.mime, type.ext]); + } else if (isSvg(buffer)) { + res(['image/svg+xml', 'svg']) } else { // 種類が同定できなかったら application/octet-stream にする res(['application/octet-stream', null]); diff --git a/test/api.ts b/test/api.ts index a7142641d2..d82014e754 100644 --- a/test/api.ts +++ b/test/api.ts @@ -808,6 +808,20 @@ describe('API', () => { expect(res).have.status(400); })); + + it('SVGファイルを作成できる', async(async () => { + const izumi = await signup({ username: 'izumi' }); + + const res = await assert.request(server) + .post('/drive/files/create') + .field('i', izumi.token) + .attach('file', fs.readFileSync(__dirname + '/resources/image.svg'), 'image.svg'); + + expect(res).have.status(200); + expect(res.body).be.a('object'); + expect(res.body).have.property('name').eql('image.svg'); + expect(res.body).have.property('type').eql('image/svg+xml'); + })); }); describe('drive/files/update', () => { diff --git a/test/resources/image.svg b/test/resources/image.svg new file mode 100644 index 0000000000..1e2bf5b5bb Binary files /dev/null and b/test/resources/image.svg differ