|
|
|
@ -45,18 +45,22 @@ |
|
|
|
type="success" |
|
|
|
icon="el-icon-caret-right" |
|
|
|
:disabled="row.downloading" |
|
|
|
@click="handleDownloadFile(row)" |
|
|
|
@click="handleDownload(row)" |
|
|
|
/> |
|
|
|
<el-button |
|
|
|
size="mini" |
|
|
|
type="info" |
|
|
|
:disabled="row.pause" |
|
|
|
@click="handlePause(row)" |
|
|
|
> |
|
|
|
{{ $t('fileSystem.begin') }} |
|
|
|
<svg-icon name="pause" /> |
|
|
|
</el-button> |
|
|
|
<el-button |
|
|
|
size="mini" |
|
|
|
type="danger" |
|
|
|
icon="el-icon-delete" |
|
|
|
@click="handleRemoveFile(row)" |
|
|
|
> |
|
|
|
{{ $t('fileSystem.remove') }} |
|
|
|
</el-button> |
|
|
|
@click="handleRemove(row)" |
|
|
|
/> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
@ -72,7 +76,7 @@ export class FileInfo { |
|
|
|
path!: string |
|
|
|
size!: number |
|
|
|
progress!: number |
|
|
|
pause!: boolean |
|
|
|
pause = true |
|
|
|
blobs = new Array<BlobPart>() |
|
|
|
type!: string |
|
|
|
downloading!: boolean |
|
|
|
@ -106,49 +110,51 @@ export default class FileDownloadForm extends Vue { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private handleRemoveFile(fileInfo: FileInfo) { |
|
|
|
private handlePause(fileInfo: FileInfo) { |
|
|
|
fileInfo.pause = true |
|
|
|
fileInfo.downloading = false |
|
|
|
this.$emit('onFilePaused', fileInfo) |
|
|
|
} |
|
|
|
|
|
|
|
private handleRemove(fileInfo: FileInfo) { |
|
|
|
fileInfo.pause = true |
|
|
|
fileInfo.downloading = false |
|
|
|
fileInfo.blobs.length = 0 |
|
|
|
this.$emit('onFileRemoved', fileInfo) |
|
|
|
} |
|
|
|
|
|
|
|
private handleDownloadFile(fileInfo: FileInfo) { |
|
|
|
fileInfo.pause = false |
|
|
|
fileInfo.downloading = true |
|
|
|
if (fileInfo.progress >= 100) { |
|
|
|
this.downloadBlob(fileInfo) |
|
|
|
} else { |
|
|
|
this.downlodFile(fileInfo, (downloadSize: number) => { |
|
|
|
if (downloadSize >= fileInfo.size) { |
|
|
|
this.$emit('onFileDownloaded', fileInfo) |
|
|
|
} |
|
|
|
}) |
|
|
|
private handleDownload(fileInfo: FileInfo) { |
|
|
|
if (!fileInfo.downloading) { |
|
|
|
fileInfo.pause = false |
|
|
|
fileInfo.downloading = true |
|
|
|
if (this.downloadProgress(fileInfo) >= 100) { |
|
|
|
this.downloadBlob(fileInfo) |
|
|
|
} else { |
|
|
|
this.downlodFile(fileInfo) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private downlodFile(fileInfo: FileInfo, callback: Function) { |
|
|
|
private downlodFile(fileInfo: FileInfo) { |
|
|
|
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) |
|
|
|
}) |
|
|
|
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) |
|
|
|
} else { |
|
|
|
// 合并下载文件 |
|
|
|
this.downloadBlob(fileInfo) |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
private downloadBlob(fileInfo: FileInfo) { |
|
|
|
@ -160,6 +166,10 @@ export default class FileDownloadForm extends Vue { |
|
|
|
document.body.appendChild(link) |
|
|
|
link.click() |
|
|
|
URL.revokeObjectURL(url) |
|
|
|
|
|
|
|
fileInfo.pause = true |
|
|
|
fileInfo.downloading = false |
|
|
|
this.$emit('onFileDownloaded', fileInfo) |
|
|
|
} |
|
|
|
|
|
|
|
private onFormClosed() { |
|
|
|
|