mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-01-22 00:07:52 +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)
|
||||
return {
|
||||
index: this.item.index,
|
||||
directory: this.directory,
|
||||
...this.itemData,
|
||||
files
|
||||
}
|
||||
|
@ -78,6 +78,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Path from 'path'
|
||||
import uploadHelpers from '@/mixins/uploadHelpers'
|
||||
|
||||
export default {
|
||||
@ -243,7 +244,7 @@ export default {
|
||||
ref.setUploadStatus(status)
|
||||
}
|
||||
},
|
||||
uploadItem(item) {
|
||||
async uploadItem(item) {
|
||||
var form = new FormData()
|
||||
form.set('title', item.title)
|
||||
if (!this.selectedLibraryIsPodcast) {
|
||||
@ -294,18 +295,41 @@ export default {
|
||||
return
|
||||
}
|
||||
|
||||
var items = this.validateItems()
|
||||
const items = this.validateItems()
|
||||
if (!items) {
|
||||
this.$toast.error('Some invalid items')
|
||||
return
|
||||
}
|
||||
this.processing = true
|
||||
var itemsUploaded = 0
|
||||
var itemsFailed = 0
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
var item = items[i]
|
||||
|
||||
const itemsToUpload = []
|
||||
|
||||
// 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')
|
||||
var result = await this.uploadItem(item)
|
||||
const result = await this.uploadItem(item)
|
||||
if (result) itemsUploaded++
|
||||
else itemsFailed++
|
||||
this.updateItemCardStatus(item.index, result ? 'success' : 'failed')
|
||||
|
@ -4,7 +4,7 @@ const SupportedFileTypes = {
|
||||
ebook: ['epub', 'pdf', 'mobi', 'azw3', 'cbr', 'cbz'],
|
||||
info: ['nfo'],
|
||||
text: ['txt'],
|
||||
metadata: ['opf', 'abs']
|
||||
metadata: ['opf', 'abs', 'xml', 'json']
|
||||
}
|
||||
|
||||
const DownloadStatus = {
|
||||
|
@ -1,27 +1,50 @@
|
||||
const Logger = require('../Logger')
|
||||
const Path = require('path')
|
||||
const Logger = require('../Logger')
|
||||
const fs = require('../libs/fsExtra')
|
||||
|
||||
class FileSystemController {
|
||||
constructor() { }
|
||||
|
||||
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
|
||||
})
|
||||
|
||||
// Do not include existing mapped library paths in response
|
||||
this.db.libraries.forEach(lib => {
|
||||
lib.folders.forEach((folder) => {
|
||||
var dir = folder.fullPath
|
||||
let dir = folder.fullPath
|
||||
if (dir.includes(global.appRoot)) dir = dir.replace(global.appRoot, '')
|
||||
excludedDirs.push(dir)
|
||||
})
|
||||
})
|
||||
|
||||
Logger.debug(`[Server] get file system paths, excluded: ${excludedDirs.join(', ')}`)
|
||||
res.json({
|
||||
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()
|
@ -197,6 +197,7 @@ class ApiRouter {
|
||||
// File System Routes
|
||||
//
|
||||
this.router.get('/filesystem', FileSystemController.getPaths.bind(this))
|
||||
this.router.post('/filesystem/pathexists', FileSystemController.checkPathExists.bind(this))
|
||||
|
||||
//
|
||||
// Author Routes
|
||||
|
Loading…
Reference in New Issue
Block a user