refactor: 上次非对象存储文件时,使用较小的切片

This commit is contained in:
jmal 2023-12-04 18:08:30 +08:00
parent d4def8612f
commit dbb385fe76
3 changed files with 130 additions and 69 deletions

View File

@ -47,18 +47,14 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.container { .container {
width: 100%; width: 100%;
/*min-height: calc(100vh - 50px);*/ min-height: calc(100vh - 101px);
} }
.share-empty { .share-empty {
/*height: 30%;*/
/*width: 50%;*/
color: #6e6e6e; color: #6e6e6e;
margin: 20%; position: absolute;
/*left: 50%;*/ top: 50%;
/*position: absolute;*/ left: 50%;
/*top: 50%;*/ transform: translate(-50%, -50%);
/*left: 50%;*/
/*margin: -15% 0 0 -25%;*/
} }
.share-empty-icon { .share-empty-icon {
width: 268px; width: 268px;

View File

@ -2629,6 +2629,15 @@ export default {
this.highlightNewFile() this.highlightNewFile()
// 设置挂载文件的用户名(文件的所有者) // 设置挂载文件的用户名(文件的所有者)
this.setMountFileOwner() this.setMountFileOwner()
// 存储类型
let storageType = 'Object'
if (this.fileList.length > 0) {
const pathRegex = /([a-zA-Z]:\\[^*|"<>?\n]*)|(\/[^*|"<>?\n]*)/;
if (!pathRegex.test(this.fileList[0].id)) {
storageType = 'File'
}
}
Bus.$emit('storageTypeChange', storageType)
}, },
// 设置挂载文件的用户名(文件的所有者) // 设置挂载文件的用户名(文件的所有者)
setMountFileOwner() { setMountFileOwner() {

View File

@ -2,6 +2,7 @@
<div id="global-uploader"> <div id="global-uploader">
<!-- 上传 --> <!-- 上传 -->
<uploader <uploader
v-if="showUploader"
ref="uploader" ref="uploader"
:options="options" :options="options"
:file-status-text="statusText" :file-status-text="statusText"
@ -20,22 +21,41 @@
<span>上传文件到当前目录下</span> <span>上传文件到当前目录下</span>
</uploader-drop> </uploader-drop>
<uploader-btn id="global-uploader-btn" ref="uploadBtn" :attrs="attrs">选择文件</uploader-btn> <uploader-btn id="global-uploader-btn" ref="uploadBtn" :attrs="attrs"
>选择文件</uploader-btn
>
<uploader-btn id="folder-uploader-btn" ref="folderBtn" :directory="true">选择文件夹</uploader-btn> <uploader-btn id="folder-uploader-btn" ref="folderBtn" :directory="true"
>选择文件夹</uploader-btn
>
<uploader-list v-show="panelShow"> <uploader-list v-show="panelShow">
<div slot-scope="props" class="file-panel" :class="{'collapse': collapse}" :style="filePanel"> <div
slot-scope="props"
class="file-panel"
:class="{ collapse: collapse }"
:style="filePanel"
>
<div class="file-title"> <div class="file-title">
<h2 class="files-title">文件列表</h2> <h2 class="files-title">文件列表</h2>
<div class="operate"> <div class="operate">
<el-button v-if="fileListLength > 0" type="text" class="button-collapse" @click="shrink"> <el-button
v-if="fileListLength > 0"
type="text"
class="button-collapse"
@click="shrink"
>
<i class="iconfont el-icon-position"></i> <i class="iconfont el-icon-position"></i>
</el-button> </el-button>
<!--<el-button type="text" class="button-collapse" :title="collapse ? '展开':'折叠' " @click="fileListShow">--> <!--<el-button type="text" class="button-collapse" :title="collapse ? '展开':'折叠' " @click="fileListShow">-->
<!--<i class="iconfont" :class="collapse ? 'el-icon-circle-plus-outline': 'el-icon-remove-outline'"></i>--> <!--<i class="iconfont" :class="collapse ? 'el-icon-circle-plus-outline': 'el-icon-remove-outline'"></i>-->
<!--</el-button>--> <!--</el-button>-->
<el-button type="text" class="button-collapse" title="关闭" @click="close"> <el-button
type="text"
class="button-collapse"
title="关闭"
@click="close"
>
<i class="iconfont el-icon-circle-close"></i> <i class="iconfont el-icon-circle-close"></i>
</el-button> </el-button>
</div> </div>
@ -43,20 +63,30 @@
<ul class="file-list"> <ul class="file-list">
<li v-for="file in props.fileList" :key="file.id"> <li v-for="file in props.fileList" :key="file.id">
<uploader-file ref="files" :class="'file_' + file.id" :file="file" :list="true"></uploader-file> <uploader-file
ref="files"
:class="'file_' + file.id"
:file="file"
:list="true"
></uploader-file>
</li> </li>
<div v-if="!props.fileList.length" class="no-file"><i class="iconfont icon-empty-file"></i> 暂无待上传文件 <div v-if="!props.fileList.length" class="no-file">
<i class="iconfont icon-empty-file"></i> 暂无待上传文件
</div> </div>
</ul> </ul>
</div> </div>
</uploader-list> </uploader-list>
</uploader> </uploader>
<div class="process-area" id="drag-ball" @click="expand" :style="processAreaClass"> <div
class="process-area"
id="drag-ball"
@click="expand"
:style="processAreaClass"
>
<div class="process-anime"> <div class="process-anime">
<div class="cube-a" :style="{'top': -process-65+'%'}"></div> <div class="cube-a" :style="{ top: -process - 65 + '%' }"></div>
<div class="cube-b" :style="{'top': -process-65+'%'}"></div> <div class="cube-b" :style="{ top: -process - 65 + '%' }"></div>
<div v-if="process < 100" class="process-info"> <div v-if="process < 100" class="process-info">
<div class="process">{{ process }}%</div> <div class="process">{{ process }}%</div>
@ -66,14 +96,17 @@
<div v-if="process >= 100" class="done"> <div v-if="process >= 100" class="done">
<svg xmlns="http://www.w3.org/2000/svg" class="done-icon checkmark"> <svg xmlns="http://www.w3.org/2000/svg" class="done-icon checkmark">
<!--"M 14.1 27.2 l 7.1 7.2 l 16.7 -16.8"--> <!--"M 14.1 27.2 l 7.1 7.2 l 16.7 -16.8"-->
<path d="M 13.1 21.2 l 5.1 5.2 l 12.7 -12.8" class="checkmark__check" style="fill: transparent;"></path> <path
d="M 13.1 21.2 l 5.1 5.2 l 12.7 -12.8"
class="checkmark__check"
style="fill: transparent;"
></path>
<!--<path v-if="pc" d="M 13.1 21.2 l 5.1 5.2 l 12.7 -12.8" class="checkmark__check" style="fill: transparent;"></path>--> <!--<path v-if="pc" d="M 13.1 21.2 l 5.1 5.2 l 12.7 -12.8" class="checkmark__check" style="fill: transparent;"></path>-->
<!--<path v-if="!pc" d="M 15.5 20.2 l 3.5 3.6 l 7.7 -7.8" class="checkmark__check" style="fill: transparent;"></path>--> <!--<path v-if="!pc" d="M 15.5 20.2 l 3.5 3.6 l 7.7 -7.8" class="checkmark__check" style="fill: transparent;"></path>-->
</svg> </svg>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
@ -96,6 +129,7 @@ export default {
components: {}, components: {},
data() { data() {
return { return {
showUploader: true,
username: this.$store.state.user.name, username: this.$store.state.user.name,
options: { options: {
target: api.simpleUploadURL, target: api.simpleUploadURL,
@ -121,11 +155,11 @@ export default {
}, },
parseTimeRemaining: function (timeRemaining, parsedTimeRemaining) { parseTimeRemaining: function (timeRemaining, parsedTimeRemaining) {
return parsedTimeRemaining return parsedTimeRemaining
.replace(/\syears?/, '年') .replace(/\syears?/, '年')
.replace(/\days?/, '天') .replace(/\days?/, '天')
.replace(/\shours?/, '小时') .replace(/\shours?/, '小时')
.replace(/\sminutes?/, '分钟') .replace(/\sminutes?/, '分钟')
.replace(/\sseconds?/, '秒') .replace(/\sseconds?/, '秒')
}, },
headers: { headers: {
'jmal-token': this.$store.state.user.token, 'jmal-token': this.$store.state.user.token,
@ -161,12 +195,7 @@ export default {
dragoverLoop: null, dragoverLoop: null,
successMsg: null, successMsg: null,
enableDragUplaod: false,// 是否启用拖拽上传 enableDragUplaod: false,// 是否启用拖拽上传
} uploader: null,
},
computed: {
// Uploader实例
uploader() {
return this.$refs.uploader.uploader
} }
}, },
watch: { watch: {
@ -219,6 +248,20 @@ export default {
that.dragover = false that.dragover = false
}, false); }, false);
Bus.$on('storageTypeChange', storageType => {
if (storageType === 'File') {
if (this.options.chunkSize === 1024 * 1024) {
return
}
this.updateChunkSize(1024 * 1024)
} else {
if (this.options.chunkSize === 5 * 1024 * 1024) {
return
}
this.updateChunkSize(5 * 1024 * 1024)
}
})
Bus.$on('fileListScrollTop', fileListScrollTop => { Bus.$on('fileListScrollTop', fileListScrollTop => {
this.fileListScrollTop = fileListScrollTop this.fileListScrollTop = fileListScrollTop
}) })
@ -245,11 +288,7 @@ export default {
this.shrink() this.shrink()
} }
}) })
this.initUploader()
this.$nextTick(() => {
window.uploader = this.$refs.uploader.uploader
})
}, },
destroyed() { destroyed() {
Bus.$off('openUploader') Bus.$off('openUploader')
@ -257,6 +296,26 @@ export default {
Bus.$off('uploadFileListBack') Bus.$off('uploadFileListBack')
}, },
methods: { methods: {
initUploader() {
this.$nextTick(() => {
this.uploader = this.$refs.uploader.uploader
window.uploader = this.uploader
})
},
updateChunkSize(chunkSize) {
// 更新 options
this.options.chunkSize = chunkSize;
console.log('updateChunkSize', chunkSize)
// 重新渲染 uploader 组件
this.showUploader = false;
this.$nextTick(() => {
this.showUploader = true;
this.$nextTick(() => {
this.uploader = this.$refs.uploader.uploader
window.uploader = this.uploader
});
});
},
onDragenter(e) { onDragenter(e) {
this.params = { this.params = {
currentDirectory: this.$route.query.path || '/', currentDirectory: this.$route.query.path || '/',
@ -310,10 +369,6 @@ export default {
}) })
}, },
onFileProgress(rootFile, file, chunk) { onFileProgress(rootFile, file, chunk) {
// const fileList = window.uploader.fileList
// fileList.forEach(file => {
// file.currentSpeed
// })
this.netSpeed = formatNetSpeed(file.currentSpeed) this.netSpeed = formatNetSpeed(file.currentSpeed)
this.process = Math.trunc(window.uploader.progress() * 100) this.process = Math.trunc(window.uploader.progress() * 100)
if (this.process === -10 || this.process === 100 || this.fileListLength === 0) { if (this.process === -10 || this.process === 100 || this.fileListLength === 0) {
@ -659,7 +714,7 @@ export default {
.file-panel { .file-panel {
background-color: #fff; background-color: #fff;
border: 1px solid #e2e2e2; border: 1px solid #e2e2e2;
box-shadow: 0 0 10px rgba(0, 0, 0, .2); box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
right: 2%; right: 2%;
bottom: 2%; bottom: 2%;
@ -671,8 +726,8 @@ export default {
background-size: 100% 100%; background-size: 100% 100%;
border-radius: 7px 7px 0 0; border-radius: 7px 7px 0 0;
position: fixed; position: fixed;
-webkit-transition: all .5s ease-in-out 0s; -webkit-transition: all 0.5s ease-in-out 0s;
transition: all .5s ease-in-out 0s; transition: all 0.5s ease-in-out 0s;
ul { ul {
white-space: nowrap; white-space: nowrap;
@ -680,7 +735,7 @@ export default {
overflow-x: auto; overflow-x: auto;
overflow-y: hidden; overflow-y: hidden;
padding: 0 0.1rem; padding: 0 0.1rem;
margin-bottom: -.2rem; margin-bottom: -0.2rem;
overflow: -moz-scrollbars-none; overflow: -moz-scrollbars-none;
overflow: -moz-scrollbars-none; overflow: -moz-scrollbars-none;
} }
@ -732,7 +787,7 @@ export default {
&.collapse { &.collapse {
.file-title { .file-title {
background-color: #E7ECF2; background-color: #e7ecf2;
} }
} }
} }
@ -745,49 +800,49 @@ export default {
font-size: 16px; font-size: 16px;
} }
> > > .uploader-file-icon { > .uploader-file-icon {
&:before { &:before {
content: '' !important; content: "" !important;
} }
background: url(./images/file.svg); background: url(./images/file.svg);
&[icon=image] { &[icon="image"] {
background: url(./images/image.svg); background: url(./images/image.svg);
} }
&[icon=video] { &[icon="video"] {
background: url(./images/video.svg); background: url(./images/video.svg);
} }
&[icon=document] { &[icon="document"] {
background: url(./images/docment.svg); background: url(./images/docment.svg);
} }
&[icon=audio] { &[icon="audio"] {
background: url(./images/audio.svg); background: url(./images/audio.svg);
} }
&[icon=folder] { &[icon="folder"] {
background: url(./images/folder.svg); background: url(./images/folder.svg);
} }
} }
> > > .uploader-file-actions > span { > .uploader-file-actions > span {
margin-right: 6px; margin-right: 6px;
} }
} }
> > > .uploader-file-status { > .uploader-file-status {
width: 32%; width: 32%;
text-indent: 20px; text-indent: 20px;
} }
> > > .uploader-file-meta { > .uploader-file-meta {
width: 0; width: 0;
} }
> > > .uploader-file-icon { > .uploader-file-icon {
width: 32px; width: 32px;
height: 32px; height: 32px;
display: inline-block; display: inline-block;
@ -796,7 +851,7 @@ export default {
margin-right: 8px; margin-right: 8px;
} }
> > > .uploader-file-actions > span { > .uploader-file-actions > span {
margin-right: 6px; margin-right: 6px;
margin-left: 8px; margin-left: 8px;
} }
@ -812,7 +867,6 @@ export default {
clip: rect(0, 0, 0, 0); clip: rect(0, 0, 0, 0);
} }
.process-area { .process-area {
right: 66px; right: 66px;
bottom: 66px; bottom: 66px;
@ -829,8 +883,8 @@ export default {
position: fixed; position: fixed;
/*animation: load-process-area .5s 1 linear forwards;*/ /*animation: load-process-area .5s 1 linear forwards;*/
/*transition: all .5s;*/ /*transition: all .5s;*/
-webkit-transition: all .5s ease-in-out 0s; -webkit-transition: all 0.5s ease-in-out 0s;
transition: all .5s ease-in-out 0s; transition: all 0.5s ease-in-out 0s;
} }
.process-area .process-info { .process-area .process-info {
@ -846,7 +900,7 @@ export default {
} }
.process-area .process-info .net-speed { .process-area .process-info .net-speed {
font-size: .7rem; font-size: 0.7rem;
white-space: nowrap; white-space: nowrap;
} }
@ -866,13 +920,13 @@ export default {
.process-anime .cube-a { .process-anime .cube-a {
position: absolute; position: absolute;
left: 50%; left: 50%;
background: rgba(53, 53, 53, .3); background: rgba(53, 53, 53, 0.3);
width: 130px; width: 130px;
height: 130px; height: 130px;
border-radius: 50px; border-radius: 50px;
animation: fx-rotate 15s infinite linear; animation: fx-rotate 15s infinite linear;
transform-origin: 50% 50%; transform-origin: 50% 50%;
transition: .5s; transition: 0.5s;
} }
.process-anime .cube-b { .process-anime .cube-b {
@ -884,7 +938,7 @@ export default {
border-radius: 50px; border-radius: 50px;
animation: fx-rotate 10s infinite reverse linear; animation: fx-rotate 10s infinite reverse linear;
transform-origin: 50% 50%; transform-origin: 50% 50%;
transition: .5s; transition: 0.5s;
} }
/**成功**/ /**成功**/
@ -906,7 +960,8 @@ export default {
stroke: #fff; stroke: #fff;
stroke-miterlimit: 10; stroke-miterlimit: 10;
box-shadow: inset 0 0 0 #fdda65; box-shadow: inset 0 0 0 #fdda65;
animation: fill-data .4s ease-in-out .4s forwards, scale-data .3s ease-in-out .9s both; animation: fill-data 0.4s ease-in-out 0.4s forwards,
scale-data 0.3s ease-in-out 0.9s both;
} }
.process-anime .done .checkmark__check { .process-anime .done .checkmark__check {
@ -914,7 +969,7 @@ export default {
transform-origin: 50% 50%; transform-origin: 50% 50%;
stroke-dasharray: 48; stroke-dasharray: 48;
stroke-dashoffset: 48; stroke-dashoffset: 48;
animation: stroke-data .3s cubic-bezier(.65, 0, .45, 1) .8s forwards; animation: stroke-data 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
} }
@keyframes fx-rotate { @keyframes fx-rotate {
@ -927,7 +982,8 @@ export default {
} }
@keyframes scale-data { @keyframes scale-data {
0%, 100% { 0%,
100% {
transform: none; transform: none;
} }
50% { 50% {