5 changed files with 244 additions and 56 deletions
Binary file not shown.
@ -0,0 +1,165 @@ |
|||
<template> |
|||
<el-dialog |
|||
v-el-draggable-dialog |
|||
width="800px" |
|||
:visible="showDialog" |
|||
:title="$t('fileSystem.downloadTask')" |
|||
@close="onFormClosed" |
|||
> |
|||
<el-table |
|||
:data="files" |
|||
stripe |
|||
style="width: 100%" |
|||
> |
|||
<el-table-column |
|||
prop="name" |
|||
:label="$t('fileSystem.name')" |
|||
width="180" |
|||
/> |
|||
<el-table-column |
|||
prop="size" |
|||
:label="$t('fileSystem.size')" |
|||
width="180" |
|||
/> |
|||
<el-table-column |
|||
:label="$t('fileSystem.progress')" |
|||
width="180" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<el-progress |
|||
:text-inside="true" |
|||
:stroke-width="26" |
|||
:status="downloadStatus(scope.row)" |
|||
:percentage="downloadProgress(scope.row)" |
|||
/> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
:label="$t('global.operaActions')" |
|||
align="center" |
|||
width="250px" |
|||
> |
|||
<template slot-scope="{row}"> |
|||
<el-button |
|||
size="mini" |
|||
type="success" |
|||
icon="el-icon-caret-right" |
|||
@click="handleDownloadFile(row)" |
|||
> |
|||
{{ $t('fileSystem.begin') }} |
|||
</el-button> |
|||
<el-button |
|||
size="mini" |
|||
type="danger" |
|||
icon="el-icon-delete" |
|||
@click="handleRemoveFile(row)" |
|||
> |
|||
{{ $t('fileSystem.remove') }} |
|||
</el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import { Component, Vue, Prop } from 'vue-property-decorator' |
|||
import FileSystemService from '@/api/filemanagement' |
|||
|
|||
export class FileInfo { |
|||
name!: string |
|||
path!: string |
|||
size!: number |
|||
progress!: number |
|||
pause!: boolean |
|||
blobs = new Array<BlobPart>() |
|||
type!: string |
|||
} |
|||
|
|||
@Component({ |
|||
name: 'FileDownloadForm' |
|||
}) |
|||
export default class FileDownloadForm extends Vue { |
|||
@Prop({ default: false }) |
|||
private showDialog!: boolean |
|||
|
|||
@Prop({ default: '' }) |
|||
private files!: FileInfo[] |
|||
|
|||
get downloadProgress() { |
|||
return (fileInfo: FileInfo) => { |
|||
return Math.round(fileInfo.progress / fileInfo.size * 10000) / 100 |
|||
} |
|||
} |
|||
|
|||
get downloadStatus() { |
|||
return (fileInfo: FileInfo) => { |
|||
const progress = Math.round(fileInfo.progress / fileInfo.size * 10000) / 100 |
|||
if (progress >= 50 && progress < 100) { |
|||
return 'warning' |
|||
} |
|||
if (progress >= 100) { |
|||
return 'success' |
|||
} |
|||
} |
|||
} |
|||
|
|||
private handleRemoveFile(fileInfo: FileInfo) { |
|||
fileInfo.pause = true |
|||
fileInfo.blobs.length = 0 |
|||
this.$emit('onFileRemoved', fileInfo) |
|||
} |
|||
|
|||
private handleDownloadFile(fileInfo: FileInfo) { |
|||
fileInfo.pause = false |
|||
if (fileInfo.progress >= 100) { |
|||
this.downloadBlob(fileInfo) |
|||
} else { |
|||
this.downlodFile(fileInfo, (downloadSize: number) => { |
|||
if (downloadSize >= fileInfo.size) { |
|||
this.$emit('onFileDownloaded', fileInfo) |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
private downlodFile(fileInfo: FileInfo, callback: Function) { |
|||
if (fileInfo.pause) { |
|||
return |
|||
} |
|||
FileSystemService.downlodFle(fileInfo.name, fileInfo.path, fileInfo.progress).then((res: any) => { |
|||
fileInfo.type = res.headers['content-type'] |
|||
// 获取当前下载字节大小 |
|||
const downloadByte = res.data.size |
|||
// 当前下载分块入栈 |
|||
fileInfo.blobs.push(res.data) |
|||
fileInfo.progress += downloadByte |
|||
if (fileInfo.size > fileInfo.progress) { |
|||
this.downlodFile(fileInfo, callback) |
|||
} else { |
|||
// 合并下载文件 |
|||
this.downloadBlob(fileInfo) |
|||
// 下载完成后的回调 |
|||
callback(fileInfo.size) |
|||
} |
|||
}).catch(() => { |
|||
callback(fileInfo.size) |
|||
}) |
|||
} |
|||
|
|||
private downloadBlob(fileInfo: FileInfo) { |
|||
const url = window.URL.createObjectURL(new Blob(fileInfo.blobs, { type: fileInfo.type })) |
|||
const link = document.createElement('a') |
|||
link.style.display = 'none' |
|||
link.href = url |
|||
link.setAttribute('download', fileInfo.name) |
|||
document.body.appendChild(link) |
|||
link.click() |
|||
URL.revokeObjectURL(url) |
|||
} |
|||
|
|||
private onFormClosed() { |
|||
this.$emit('closed') |
|||
} |
|||
} |
|||
</script> |
|||
Loading…
Reference in new issue