mirror of
https://github.com/nextcloud/server.git
synced 2026-04-21 06:08:46 -04:00
fix(files): better upload error handling
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
This commit is contained in:
parent
431ac74d78
commit
f89ef392b3
23 changed files with 88 additions and 32 deletions
|
|
@ -193,6 +193,8 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
$parentPath = '';
|
||||
}
|
||||
$req = $this->server->httpRequest;
|
||||
|
||||
// If chunked upload
|
||||
if ($req->getHeader('OC-Chunked')) {
|
||||
$info = \OC_FileChunking::decodeName($newName);
|
||||
$chunkHandler = $this->getFileChunking($info);
|
||||
|
|
@ -202,6 +204,10 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
// use target file name for free space check in case of shared files
|
||||
$path = rtrim($parentPath, '/') . '/' . $info['name'];
|
||||
}
|
||||
|
||||
// Strip any duplicate slashes
|
||||
$path = str_replace('//', '/', $path);
|
||||
|
||||
$freeSpace = $this->getFreeSpace($path);
|
||||
if ($freeSpace >= 0 && $length > $freeSpace) {
|
||||
if (isset($chunkHandler)) {
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ export default {
|
|||
|
||||
mounted() {
|
||||
// Warn the user if the available storage is 0 on page load
|
||||
if (this.storageStats?.free === 0) {
|
||||
if (this.storageStats?.free <= 0) {
|
||||
this.showStorageFullWarning()
|
||||
}
|
||||
},
|
||||
|
|
@ -123,7 +123,7 @@ export default {
|
|||
}
|
||||
|
||||
// Warn the user if the available storage changed from > 0 to 0
|
||||
if (this.storageStats?.free !== 0 && response.data.data?.free === 0) {
|
||||
if (this.storageStats?.free > 0 && response.data.data?.free <= 0) {
|
||||
this.showStorageFullWarning()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@
|
|||
:destination="currentFolder"
|
||||
:multiple="true"
|
||||
class="files-list__header-upload-button"
|
||||
@failed="onUploadFail"
|
||||
@uploaded="onUpload" />
|
||||
</template>
|
||||
</BreadCrumbs>
|
||||
|
|
@ -126,6 +127,8 @@ import { Folder, Node, Permission } from '@nextcloud/files'
|
|||
import { getCapabilities } from '@nextcloud/capabilities'
|
||||
import { join, dirname } from 'path'
|
||||
import { orderBy } from 'natural-orderby'
|
||||
import { Parser } from 'xml2js'
|
||||
import { showError } from '@nextcloud/dialogs'
|
||||
import { translate, translatePlural } from '@nextcloud/l10n'
|
||||
import { Type } from '@nextcloud/sharing'
|
||||
import { UploadPicker } from '@nextcloud/upload'
|
||||
|
|
@ -515,6 +518,39 @@ export default defineComponent({
|
|||
}
|
||||
},
|
||||
|
||||
async onUploadFail(upload: Upload) {
|
||||
const status = upload.response?.status || 0
|
||||
|
||||
// Check known status codes
|
||||
if (status === 507) {
|
||||
showError(this.t('files', 'Not enough free space'))
|
||||
return
|
||||
} else if (status === 404 || status === 409) {
|
||||
showError(this.t('files', 'Target folder does not exist any more'))
|
||||
return
|
||||
} else if (status === 403) {
|
||||
showError(this.t('files', 'Operation is blocked by access control'))
|
||||
return
|
||||
} else if (status !== 0) {
|
||||
showError(this.t('files', 'Error when assembling chunks, status code {status}', { status }))
|
||||
return
|
||||
}
|
||||
|
||||
// Else we try to parse the response error message
|
||||
try {
|
||||
const parser = new Parser({ trim: true, explicitRoot: false })
|
||||
const response = await parser.parseStringPromise(upload.response?.data)
|
||||
const message = response['s:message'][0] as string
|
||||
if (typeof message === 'string' && message.trim() !== '') {
|
||||
// Unfortunatly, the server message is not translated
|
||||
showError(this.t('files', 'Error during upload: {message}', { message }))
|
||||
return
|
||||
}
|
||||
} catch (error) {}
|
||||
|
||||
showError(this.t('files', 'Unknown error during upload'))
|
||||
},
|
||||
|
||||
openSharingSidebar() {
|
||||
if (window?.OCA?.Files?.Sidebar?.setActiveTab) {
|
||||
window.OCA.Files.Sidebar.setActiveTab('sharing')
|
||||
|
|
|
|||
4
dist/core-common.js
vendored
4
dist/core-common.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-common.js.LICENSE.txt
vendored
2
dist/core-common.js.LICENSE.txt
vendored
|
|
@ -74,6 +74,8 @@
|
|||
|
||||
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||
|
||||
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||
|
||||
/**
|
||||
* @copyright 2021 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
*
|
||||
|
|
|
|||
2
dist/core-common.js.map
vendored
2
dist/core-common.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files-init.js
vendored
4
dist/files-init.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files-init.js.LICENSE.txt
vendored
2
dist/files-init.js.LICENSE.txt
vendored
|
|
@ -1,5 +1,3 @@
|
|||
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||
|
||||
/**
|
||||
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
*
|
||||
|
|
|
|||
2
dist/files-init.js.map
vendored
2
dist/files-init.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/files-main.js
vendored
4
dist/files-main.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files-main.js.LICENSE.txt
vendored
2
dist/files-main.js.LICENSE.txt
vendored
|
|
@ -16,6 +16,8 @@
|
|||
* @license MIT
|
||||
*/
|
||||
|
||||
/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
|
||||
|
||||
/**
|
||||
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
*
|
||||
|
|
|
|||
2
dist/files-main.js.map
vendored
2
dist/files-main.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/settings-users-8351.js
vendored
4
dist/settings-users-8351.js
vendored
File diff suppressed because one or more lines are too long
2
dist/settings-users-8351.js.map
vendored
2
dist/settings-users-8351.js.map
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
dist/settings-vue-settings-personal-info.js
vendored
4
dist/settings-vue-settings-personal-info.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
dist/systemtags-init.js
vendored
4
dist/systemtags-init.js
vendored
File diff suppressed because one or more lines are too long
2
dist/systemtags-init.js.LICENSE.txt
vendored
2
dist/systemtags-init.js.LICENSE.txt
vendored
|
|
@ -1,5 +1,3 @@
|
|||
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||
|
||||
/**
|
||||
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
*
|
||||
|
|
|
|||
2
dist/systemtags-init.js.map
vendored
2
dist/systemtags-init.js.map
vendored
File diff suppressed because one or more lines are too long
21
package-lock.json
generated
21
package-lock.json
generated
|
|
@ -87,7 +87,8 @@
|
|||
"vuedraggable": "^2.24.3",
|
||||
"vuex": "^3.6.2",
|
||||
"vuex-router-sync": "^5.0.0",
|
||||
"webdav": "^5.3.1"
|
||||
"webdav": "^5.3.1",
|
||||
"xml2js": "^0.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/node": "^7.22.10",
|
||||
|
|
@ -21152,6 +21153,18 @@
|
|||
"xml2js": "^0.4.5"
|
||||
}
|
||||
},
|
||||
"node_modules/parse-bmfont-xml/node_modules/xml2js": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
|
||||
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
|
||||
"dependencies": {
|
||||
"sax": ">=0.6.0",
|
||||
"xmlbuilder": "~11.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/parse-headers": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
|
||||
|
|
@ -28026,9 +28039,9 @@
|
|||
"integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="
|
||||
},
|
||||
"node_modules/xml2js": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
|
||||
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
|
||||
"version": "0.6.2",
|
||||
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
|
||||
"integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
|
||||
"dependencies": {
|
||||
"sax": ">=0.6.0",
|
||||
"xmlbuilder": "~11.0.0"
|
||||
|
|
|
|||
|
|
@ -114,7 +114,8 @@
|
|||
"vuedraggable": "^2.24.3",
|
||||
"vuex": "^3.6.2",
|
||||
"vuex-router-sync": "^5.0.0",
|
||||
"webdav": "^5.3.1"
|
||||
"webdav": "^5.3.1",
|
||||
"xml2js": "^0.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/node": "^7.22.10",
|
||||
|
|
|
|||
Loading…
Reference in a new issue