fix(files): better upload error handling

Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
This commit is contained in:
John Molakvoæ 2023-11-08 18:38:44 +01:00
parent 431ac74d78
commit f89ef392b3
No known key found for this signature in database
GPG Key ID: 60C25B8C072916CF
23 changed files with 63 additions and 7 deletions

View File

@ -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)) {

View File

@ -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()
}

View File

@ -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')

BIN
dist/core-common.js vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
dist/files-init.js vendored

Binary file not shown.

Binary file not shown.

BIN
dist/files-init.js.map vendored

Binary file not shown.

BIN
dist/files-main.js vendored

Binary file not shown.

Binary file not shown.

BIN
dist/files-main.js.map vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

21
package-lock.json generated
View File

@ -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"

View File

@ -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",