5 changed files with 230 additions and 29 deletions
-
12src/api/collect/collect.js
-
1src/views/collectReorganizi/collectionLibrary/mixins/index.js
-
75src/views/collectReorganizi/collectionLibrary/module/collectMoveFile/index.vue
-
137src/views/collectReorganizi/collectionLibrary/module/uploadOriginal/bigUpload.vue
-
20src/views/collectReorganizi/collectionLibrary/module/uploadOriginal/index.vue
@ -0,0 +1,137 @@ |
|||
<template> |
|||
<div> |
|||
<!--上传组件--> |
|||
<el-upload |
|||
class="upload-demo" |
|||
:action="uploadUrl" |
|||
:auto-upload="false" |
|||
:on-change="handleChange" |
|||
:before-upload="handleBeforeUpload" |
|||
:on-progress="handleProgress" |
|||
> |
|||
<el-button slot="trigger">选取文件</el-button> |
|||
<!--上传文件按钮--> |
|||
<el-button style="margin-left: 10px" type="primary" :loading="uploading" :disabled="files.length === 0" @click="handleUpload"> |
|||
上传文件 |
|||
</el-button> |
|||
<el-progress :percentage="percent" /> |
|||
</el-upload> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { mapGetters } from 'vuex' |
|||
import axios from 'axios' |
|||
|
|||
export default { |
|||
data() { |
|||
return { |
|||
files: [], // 选中的文件列表 |
|||
uploading: false, // 是否正在上传 |
|||
percent: 0, // 上传进度 |
|||
uploadUrl: this.baseApi + '/api/collect/uploadFiles' // 上传地址 |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters([ |
|||
'baseApi' |
|||
]) |
|||
}, |
|||
methods: { |
|||
// 切片上传 |
|||
async upload(file) { |
|||
const chunkSize = 1024 * 1024 // 每个块的大小为 1MB |
|||
const fileSize = file.size // 文件大小 |
|||
const chunks = Math.ceil(fileSize / chunkSize) // 总块数 |
|||
const tasks = [] // 上传任务数组 |
|||
let uploaded = 0 // 已上传块数 |
|||
|
|||
// 文件切割 |
|||
for (let i = 0; i < chunks; i++) { |
|||
const start = i * chunkSize |
|||
const end = Math.min(start + chunkSize, fileSize) |
|||
|
|||
tasks.push( |
|||
new Promise((resolve, reject) => { |
|||
const formData = new FormData() |
|||
formData.append('chunk_index', i) // 块编号 |
|||
formData.append('chunk_count', chunks) // 总块数 |
|||
formData.append('file_id', file.id) // 文件ID |
|||
formData.append('chunk_data', file.slice(start, end)) // 块数据 |
|||
|
|||
axios |
|||
.post(this.uploadUrl, formData) // 上传块数据 |
|||
.then(res => { |
|||
uploaded++ |
|||
this.percent = Math.floor((uploaded / chunks) * 100) |
|||
console.log(this.percent) |
|||
resolve() |
|||
}) |
|||
.catch(err => { |
|||
reject(err) |
|||
}) |
|||
}) |
|||
) |
|||
} |
|||
|
|||
// 待所有块上传完成后,发送合并请求 |
|||
await Promise.all(tasks) |
|||
const res = await axios.post(this.uploadUrl, { file_id: file.id, chunks }) |
|||
|
|||
// 上传成功,返回文件URL |
|||
if (res.status === 200) { |
|||
return `${this.uploadUrl}/${file.id}` |
|||
} else { |
|||
throw new Error(res.data.message) |
|||
} |
|||
}, |
|||
handleChange(files) { |
|||
this.files = files |
|||
}, |
|||
async handleUpload() { |
|||
console.log('handleUpload') |
|||
try { |
|||
console.log('handleUpload2') |
|||
this.uploading = true |
|||
console.log(this.files) |
|||
const url = await this.upload(this.files) |
|||
// 文件上传成功,将url展示给用户 |
|||
this.$message.success(`文件${this.files.name}上传成功!URL:${url}`) |
|||
// for (let i = 0; i < this.files.length; i++) { |
|||
// const file = this.files[i] |
|||
// console.log('file', file) |
|||
|
|||
// } |
|||
} catch (err) { |
|||
console.log('handleUpload3') |
|||
this.$message.error(`文件上传失败!${err.message}`) |
|||
} finally { |
|||
console.log('handleUpload4') |
|||
this.uploading = false |
|||
} |
|||
}, |
|||
handleBeforeUpload() { |
|||
// TODO: 检查文件大小、类型等 |
|||
}, |
|||
handleProgress(event, file) { |
|||
// 显示上传进度 |
|||
this.percent = Math.floor((event.loaded / event.total) * 100) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.upload-demo{ |
|||
position: relative; |
|||
display: flex; |
|||
justify-content: center; |
|||
width: 120px; |
|||
margin: 20px 0 30px 0; |
|||
.el-progress{ |
|||
position: absolute; |
|||
left: 0; |
|||
bottom: -20px; |
|||
} |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue