mirror of
https://github.com/filebrowser/filebrowser.git
synced 2024-06-07 23:00:43 +00:00
feat: upload progress based on total size (#993)
This commit is contained in:
parent
241201657c
commit
cd454bae51
5
frontend/package-lock.json
generated
5
frontend/package-lock.json
generated
@ -8802,6 +8802,11 @@
|
|||||||
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
|
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.throttle": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
|
||||||
|
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
|
||||||
|
},
|
||||||
"lodash.transform": {
|
"lodash.transform": {
|
||||||
"version": "4.6.0",
|
"version": "4.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz",
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.4",
|
||||||
"js-base64": "^2.5.1",
|
"js-base64": "^2.5.1",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
|
"lodash.throttle": "^4.1.1",
|
||||||
"material-design-icons": "^3.0.1",
|
"material-design-icons": "^3.0.1",
|
||||||
"moment": "^2.24.0",
|
"moment": "^2.24.0",
|
||||||
"normalize.css": "^8.0.1",
|
"normalize.css": "^8.0.1",
|
||||||
|
@ -89,6 +89,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapMutations } from 'vuex'
|
import { mapState, mapMutations } from 'vuex'
|
||||||
|
import throttle from 'lodash.throttle'
|
||||||
import Item from './ListingItem'
|
import Item from './ListingItem'
|
||||||
import css from '@/utils/css'
|
import css from '@/utils/css'
|
||||||
import { users, files as api } from '@/api'
|
import { users, files as api } from '@/api'
|
||||||
@ -100,7 +101,13 @@ export default {
|
|||||||
components: { Item },
|
components: { Item },
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
show: 50
|
show: 50,
|
||||||
|
uploading: {
|
||||||
|
id: 0,
|
||||||
|
count: 0,
|
||||||
|
size: 0,
|
||||||
|
progress: []
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -450,20 +457,24 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
setProgress: throttle(function() {
|
||||||
|
if (this.uploading.count == 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let sum = this.uploading.progress.reduce((acc, val) => acc + val)
|
||||||
|
this.$store.commit('setProgress', Math.ceil(sum / this.uploading.size * 100))
|
||||||
|
}, 100, {leading: false, trailing: true}),
|
||||||
handleFiles (files, base, overwrite = false) {
|
handleFiles (files, base, overwrite = false) {
|
||||||
buttons.loading('upload')
|
if (this.uploading.count == 0) {
|
||||||
|
buttons.loading('upload')
|
||||||
|
}
|
||||||
|
|
||||||
let promises = []
|
let promises = []
|
||||||
let progress = new Array(files.length).fill(0)
|
|
||||||
|
|
||||||
let onupload = (id) => (event) => {
|
let onupload = (id) => (event) => {
|
||||||
progress[id] = (event.loaded / event.total) * 100
|
this.uploading.progress[id] = event.loaded
|
||||||
|
this.setProgress()
|
||||||
let sum = 0
|
|
||||||
for (let i = 0; i < progress.length; i++) {
|
|
||||||
sum += progress[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$store.commit('setProgress', Math.ceil(sum / progress.length))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
@ -472,30 +483,50 @@ export default {
|
|||||||
if (!file.isDir) {
|
if (!file.isDir) {
|
||||||
let filename = (file.fullPath !== undefined) ? file.fullPath : file.name
|
let filename = (file.fullPath !== undefined) ? file.fullPath : file.name
|
||||||
let filenameEncoded = url.encodeRFC5987ValueChars(filename)
|
let filenameEncoded = url.encodeRFC5987ValueChars(filename)
|
||||||
promises.push(api.post(this.$route.path + base + filenameEncoded, file, overwrite, onupload(i)))
|
|
||||||
|
let id = this.uploading.id
|
||||||
|
|
||||||
|
this.uploading.size += file.size
|
||||||
|
this.uploading.id++
|
||||||
|
this.uploading.count++
|
||||||
|
|
||||||
|
let promise = api.post(this.$route.path + base + filenameEncoded, file, overwrite, throttle(onupload(id), 100)).finally(() => {
|
||||||
|
this.uploading.count--
|
||||||
|
})
|
||||||
|
|
||||||
|
promises.push(promise)
|
||||||
} else {
|
} else {
|
||||||
let uri = this.$route.path + base;
|
let uri = this.$route.path + base
|
||||||
let folders = file.path.split("/");
|
let folders = file.path.split("/")
|
||||||
|
|
||||||
for (let i = 0; i < folders.length; i++) {
|
for (let i = 0; i < folders.length; i++) {
|
||||||
let folder = folders[i];
|
let folder = folders[i]
|
||||||
let folderEncoded = encodeURIComponent(folder);
|
let folderEncoded = encodeURIComponent(folder)
|
||||||
uri += folderEncoded + "/"
|
uri += folderEncoded + "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
api.post(uri);
|
api.post(uri)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let finish = () => {
|
let finish = () => {
|
||||||
|
if (this.uploading.count > 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
buttons.success('upload')
|
buttons.success('upload')
|
||||||
|
|
||||||
this.$store.commit('setProgress', 0)
|
this.$store.commit('setProgress', 0)
|
||||||
|
this.$store.commit('setReload', true)
|
||||||
|
|
||||||
|
this.uploading.id = 0
|
||||||
|
this.uploading.sizes = []
|
||||||
|
this.uploading.progress = []
|
||||||
}
|
}
|
||||||
|
|
||||||
Promise.all(promises)
|
Promise.all(promises)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
finish()
|
finish()
|
||||||
this.$store.commit('setReload', true)
|
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
finish()
|
finish()
|
||||||
|
Loading…
Reference in New Issue
Block a user