Bläddra i källkod

Merge pull request #85 from BobbyWibowo/pr-retry-names

Patch to allow "retries" when generating random name
Kana 6 år sedan
förälder
incheckning
0157388217
2 ändrade filer med 23 tillägg och 3 borttagningar
  1. 7 0
      config.sample.js
  2. 16 3
      controllers/uploadController.js

+ 7 - 0
config.sample.js

@@ -62,6 +62,13 @@ module.exports = {
 		fileLength: 32,
 
 		/*
+			This option will limit how many times it will try to generate random names
+			for uploaded files. If this value is higher than 1, it will help in cases
+			where files with the same name already exists (higher chance with shorter file name length).
+		*/
+		maxTries: 1,
+
+		/*
 			NOTE: Thumbnails are only for the admin panel and they require you
 			to install a separate binary called graphicsmagick (http://www.graphicsmagick.org)
 			for images and ffmpeg (https://ffmpeg.org/) for video files

+ 16 - 3
controllers/uploadController.js

@@ -9,12 +9,25 @@ const utils = require('./utilsController.js');
 
 const uploadsController = {};
 
+// Let's default it to only 1 try
+const maxTries = config.uploads.maxTries || 1;
+const uploadDir = path.join(__dirname, '..', config.uploads.folder);
+
 const storage = multer.diskStorage({
 	destination: function(req, file, cb) {
-		cb(null, path.join(__dirname, '..', config.uploads.folder));
+		cb(null, uploadDir);
 	},
-	filename: function(req, file, cb) {
-		cb(null, randomstring.generate(config.uploads.fileLength) + path.extname(file.originalname));
+  	filename: function(req, file, cb) {
+		const access = i => {
+			const name = randomstring.generate(config.uploads.fileLength) + path.extname(file.originalname);
+			fs.access(path.join(uploadDir, name), err => {
+				if (err) return cb(null, name);
+				console.log(`A file named "${name}" already exists (${++i}/${maxTries}).`);
+				if (i < maxTries) return access(i);
+				return cb('Could not allocate a unique file name. Try again?');
+			});
+		};
+		access(0);
 	}
 });