mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update:Check if directory already exists before upload #1497
This commit is contained in:
		
							parent
							
								
									0678c26627
								
							
						
					
					
						commit
						9712bdf5f0
					
				| @ -114,6 +114,7 @@ export default { | |||||||
|       var files = this.item.itemFiles.concat(this.item.otherFiles) |       var files = this.item.itemFiles.concat(this.item.otherFiles) | ||||||
|       return { |       return { | ||||||
|         index: this.item.index, |         index: this.item.index, | ||||||
|  |         directory: this.directory, | ||||||
|         ...this.itemData, |         ...this.itemData, | ||||||
|         files |         files | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -78,6 +78,7 @@ | |||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script> | <script> | ||||||
|  | import Path from 'path' | ||||||
| import uploadHelpers from '@/mixins/uploadHelpers' | import uploadHelpers from '@/mixins/uploadHelpers' | ||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
| @ -243,7 +244,7 @@ export default { | |||||||
|         ref.setUploadStatus(status) |         ref.setUploadStatus(status) | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     uploadItem(item) { |     async uploadItem(item) { | ||||||
|       var form = new FormData() |       var form = new FormData() | ||||||
|       form.set('title', item.title) |       form.set('title', item.title) | ||||||
|       if (!this.selectedLibraryIsPodcast) { |       if (!this.selectedLibraryIsPodcast) { | ||||||
| @ -294,18 +295,41 @@ export default { | |||||||
|         return |         return | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       var items = this.validateItems() |       const items = this.validateItems() | ||||||
|       if (!items) { |       if (!items) { | ||||||
|         this.$toast.error('Some invalid items') |         this.$toast.error('Some invalid items') | ||||||
|         return |         return | ||||||
|       } |       } | ||||||
|       this.processing = true |       this.processing = true | ||||||
|       var itemsUploaded = 0 | 
 | ||||||
|       var itemsFailed = 0 |       const itemsToUpload = [] | ||||||
|       for (let i = 0; i < items.length; i++) { | 
 | ||||||
|         var item = items[i] |       // Check if path already exists before starting upload | ||||||
|  |       //  uploading fails if path already exists | ||||||
|  |       for (const item of items) { | ||||||
|  |         const filepath = Path.join(this.selectedFolder.fullPath, item.directory) | ||||||
|  |         const exists = await this.$axios | ||||||
|  |           .$post(`/api/filesystem/pathexists`, { filepath }) | ||||||
|  |           .then((data) => { | ||||||
|  |             if (data.exists) { | ||||||
|  |               this.$toast.error(`Filepath "${filepath}" already exists on server`) | ||||||
|  |             } | ||||||
|  |             return data.exists | ||||||
|  |           }) | ||||||
|  |           .catch((error) => { | ||||||
|  |             console.error('Failed to check if filepath exists', error) | ||||||
|  |             return false | ||||||
|  |           }) | ||||||
|  |         if (!exists) { | ||||||
|  |           itemsToUpload.push(item) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       let itemsUploaded = 0 | ||||||
|  |       let itemsFailed = 0 | ||||||
|  |       for (const item of itemsToUpload) { | ||||||
|         this.updateItemCardStatus(item.index, 'uploading') |         this.updateItemCardStatus(item.index, 'uploading') | ||||||
|         var result = await this.uploadItem(item) |         const result = await this.uploadItem(item) | ||||||
|         if (result) itemsUploaded++ |         if (result) itemsUploaded++ | ||||||
|         else itemsFailed++ |         else itemsFailed++ | ||||||
|         this.updateItemCardStatus(item.index, result ? 'success' : 'failed') |         this.updateItemCardStatus(item.index, result ? 'success' : 'failed') | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ const SupportedFileTypes = { | |||||||
|   ebook: ['epub', 'pdf', 'mobi', 'azw3', 'cbr', 'cbz'], |   ebook: ['epub', 'pdf', 'mobi', 'azw3', 'cbr', 'cbz'], | ||||||
|   info: ['nfo'], |   info: ['nfo'], | ||||||
|   text: ['txt'], |   text: ['txt'], | ||||||
|   metadata: ['opf', 'abs'] |   metadata: ['opf', 'abs', 'xml', 'json'] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const DownloadStatus = { | const DownloadStatus = { | ||||||
|  | |||||||
| @ -1,27 +1,50 @@ | |||||||
| const Logger = require('../Logger') |  | ||||||
| const Path = require('path') | const Path = require('path') | ||||||
|  | const Logger = require('../Logger') | ||||||
|  | const fs = require('../libs/fsExtra') | ||||||
| 
 | 
 | ||||||
| class FileSystemController { | class FileSystemController { | ||||||
|   constructor() { } |   constructor() { } | ||||||
| 
 | 
 | ||||||
|   async getPaths(req, res) { |   async getPaths(req, res) { | ||||||
|     var excludedDirs = ['node_modules', 'client', 'server', '.git', 'static', 'build', 'dist', 'metadata', 'config', 'sys', 'proc'].map(dirname => { |     if (!req.user.isAdminOrUp) { | ||||||
|  |       Logger.error(`[FileSystemController] Non-admin user attempting to get filesystem paths`, req.user) | ||||||
|  |       return res.sendStatus(403) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const excludedDirs = ['node_modules', 'client', 'server', '.git', 'static', 'build', 'dist', 'metadata', 'config', 'sys', 'proc'].map(dirname => { | ||||||
|       return Path.sep + dirname |       return Path.sep + dirname | ||||||
|     }) |     }) | ||||||
| 
 | 
 | ||||||
|     // Do not include existing mapped library paths in response
 |     // Do not include existing mapped library paths in response
 | ||||||
|     this.db.libraries.forEach(lib => { |     this.db.libraries.forEach(lib => { | ||||||
|       lib.folders.forEach((folder) => { |       lib.folders.forEach((folder) => { | ||||||
|         var dir = folder.fullPath |         let dir = folder.fullPath | ||||||
|         if (dir.includes(global.appRoot)) dir = dir.replace(global.appRoot, '') |         if (dir.includes(global.appRoot)) dir = dir.replace(global.appRoot, '') | ||||||
|         excludedDirs.push(dir) |         excludedDirs.push(dir) | ||||||
|       }) |       }) | ||||||
|     }) |     }) | ||||||
| 
 | 
 | ||||||
|     Logger.debug(`[Server] get file system paths, excluded: ${excludedDirs.join(', ')}`) |  | ||||||
|     res.json({ |     res.json({ | ||||||
|       directories: await this.getDirectories(global.appRoot, '/', excludedDirs) |       directories: await this.getDirectories(global.appRoot, '/', excludedDirs) | ||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   // POST: api/filesystem/pathexists
 | ||||||
|  |   async checkPathExists(req, res) { | ||||||
|  |     if (!req.user.canUpload) { | ||||||
|  |       Logger.error(`[FileSystemController] Non-admin user attempting to check path exists`, req.user) | ||||||
|  |       return res.sendStatus(403) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const filepath = req.body.filepath | ||||||
|  |     if (!filepath?.length) { | ||||||
|  |       return res.sendStatus(400) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const exists = await fs.pathExists(filepath) | ||||||
|  |     res.json({ | ||||||
|  |       exists | ||||||
|  |     }) | ||||||
|  |   } | ||||||
| } | } | ||||||
| module.exports = new FileSystemController() | module.exports = new FileSystemController() | ||||||
| @ -197,6 +197,7 @@ class ApiRouter { | |||||||
|     // File System Routes
 |     // File System Routes
 | ||||||
|     //
 |     //
 | ||||||
|     this.router.get('/filesystem', FileSystemController.getPaths.bind(this)) |     this.router.get('/filesystem', FileSystemController.getPaths.bind(this)) | ||||||
|  |     this.router.post('/filesystem/pathexists', FileSystemController.checkPathExists.bind(this)) | ||||||
| 
 | 
 | ||||||
|     //
 |     //
 | ||||||
|     // Author Routes
 |     // Author Routes
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user