Просмотр исходного кода

Merge pull request #647 from weseek/feat/use-MongoDB-GridFS-for-file-storage

Feat/use mongo db grid fs for file storage
Yuki Takei 7 лет назад
Родитель
Сommit
1f30354d10
3 измененных файлов с 90 добавлено и 9 удалено
  1. 2 1
      package.json
  2. 49 0
      src/server/service/file-uploader/gridfs.js
  3. 39 8
      yarn.lock

+ 2 - 1
package.json

@@ -99,7 +99,8 @@
     "migrate-mongo": "^4.0.0",
     "mkdirp": "~0.5.1",
     "module-alias": "^2.0.6",
-    "mongoose": "^5.2.0",
+    "mongoose": "^5.3.1",
+    "mongoose-gridfs": "^0.5.0",
     "mongoose-paginate": "^5.0.3",
     "mongoose-unique-validator": "^2.0.2",
     "multer": "~1.4.0",

+ 49 - 0
src/server/service/file-uploader/gridfs.js

@@ -0,0 +1,49 @@
+// crowi-fileupload-gridFS
+
+module.exports = function(crowi) {
+  'use strict';
+
+  var debug = require('debug')('growi:service:fileUploaderLocal')
+  var mongoose = require('mongoose');
+  var path = require('path');
+  var lib = {};
+  var AttachmentFile = {};
+
+  // instantiate mongoose-gridfs
+  var gridfs = require('mongoose-gridfs')({
+    collection: 'attachments',
+    model: 'AttachmentFile',
+    mongooseConnection: mongoose.connection
+  });
+
+  // obtain a model
+  AttachmentFile = gridfs.model;
+
+  // // delete a file
+  // lib.deleteFile = async function(fileId, filePath) {
+  //   debug('File deletion: ' + fileId);
+  //   await AttachmentFile.unlinkById(fileId, function(error, unlinkedAttachment) {
+  //     if (error) {
+  //       throw new Error(error);
+  //     }
+  //   });
+  // };
+
+  // create or save a file
+  lib.uploadFile = async function(filePath, contentType, fileStream, options) {
+    debug('File uploading: ' + filePath);
+    await AttachmentFile.write({filename: filePath, contentType: contentType}, fileStream,
+      function(error, createdFile) {
+        if (error) {
+          throw new Error('Failed to upload ' + createdFile + 'to gridFS', error);
+        }
+        return createdFile._id;
+      });
+  };
+
+  lib.generateUrl = function(filePath) {
+    return path.posix.join('/uploads', filePath);
+  };
+
+  return lib;
+};

+ 39 - 8
yarn.lock

@@ -31,6 +31,12 @@
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/@handsontable/react/-/react-2.0.0.tgz#30d9c2bd05421588a6ed1b3050b1f7dc476b35d3"
 
+"@lykmapipo/gridfs-stream@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@lykmapipo/gridfs-stream/-/gridfs-stream-1.2.0.tgz#0f74826816b4f7414ae36862d67ce4849a224d91"
+  dependencies:
+    flushwritable "^1.0.0"
+
 "@sinonjs/commons@^1.0.2":
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.0.2.tgz#3e0ac737781627b8844257fadc3d803997d0526e"
@@ -513,7 +519,7 @@ arrify@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
 
-asap@~2.0.3:
+asap@^2.0.0, asap@~2.0.3:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
 
@@ -2705,6 +2711,13 @@ dev-ip@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0"
 
+dezalgo@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+  dependencies:
+    asap "^2.0.0"
+    wrappy "1"
+
 dicer@0.2.5:
   version "0.2.5"
   resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
@@ -3618,6 +3631,10 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.1"
     readable-stream "^2.0.4"
 
+flushwritable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/flushwritable/-/flushwritable-1.0.0.tgz#3e328d8fde412ad47e738e3be750b4d290043498"
+
 fn-args@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/fn-args/-/fn-args-3.0.0.tgz#df5c3805ed41ec3b38a72aabe390cf9493ec084c"
@@ -5057,9 +5074,9 @@ jws@^3.1.4:
     jwa "^1.1.4"
     safe-buffer "^5.0.1"
 
-kareem@2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.2.1.tgz#9950809415aa3cde62ab43b4f7b919d99816e015"
+kareem@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.0.tgz#ef33c42e9024dce511eeaf440cd684f3af1fc769"
 
 keycode@^2.1.2:
   version "2.1.9"
@@ -5859,6 +5876,14 @@ mongodb@^2.0.36:
     mongodb-core "2.1.19"
     readable-stream "2.2.7"
 
+mongoose-gridfs@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/mongoose-gridfs/-/mongoose-gridfs-0.5.0.tgz#626e12ab605c2ed2a205a5953cd5aa8615f44feb"
+  dependencies:
+    "@lykmapipo/gridfs-stream" "^1.2.0"
+    lodash "^4.17.10"
+    stream-read "^1.1.2"
+
 mongoose-legacy-pluralize@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4"
@@ -5876,13 +5901,13 @@ mongoose-unique-validator@^2.0.2:
     lodash.foreach "^4.1.0"
     lodash.get "^4.0.2"
 
-mongoose@^5.2.0:
-  version "5.2.17"
-  resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.2.17.tgz#8baeb60a675d00da03633d679a72457dbb5b2285"
+mongoose@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.3.1.tgz#52d5bfb67788a2194e5f7a2a5c0d597e4b86fd7a"
   dependencies:
     async "2.6.1"
     bson "~1.0.5"
-    kareem "2.2.1"
+    kareem "2.3.0"
     lodash.get "4.4.2"
     mongodb "3.1.6"
     mongodb-core "3.1.5"
@@ -8606,6 +8631,12 @@ stream-http@^2.7.2:
     to-arraybuffer "^1.0.0"
     xtend "^4.0.0"
 
+stream-read@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/stream-read/-/stream-read-1.1.2.tgz#3137110d7aa80ba54e4b829c4cd33ca106b9564d"
+  dependencies:
+    dezalgo "^1.0.1"
+
 stream-shift@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"