用Vue的实例代码解释文件上传的切片上传,并逐行解释代码
时间: 2024-03-13 13:46:26 浏览: 48
vue中实现图片和文件上传的示例代码
好的,下面是一个使用 Vue 实现文件切片上传的示例代码,逐行解释如下:
```html
<template>
<div>
<input type="file" ref="fileInput" @change="handleFileChange" />
<button @click="upload">上传</button>
</div>
</template>
<script>
export default {
data() {
return {
file: null, // 上传的文件对象
chunkSize: 1 * 1024 * 1024, // 切片大小,这里设置为 1MB
chunks: [], // 文件切片后的数组
currentChunk: 0, // 当前上传的切片索引
uploadedChunks: [], // 已上传的切片索引
uploadUrl: "/api/upload", // 上传接口地址
uploading: false // 是否正在上传
};
},
methods: {
// 选择文件后将文件对象保存到 data 中
handleFileChange() {
this.file = this.$refs.fileInput.files[0];
},
// 切片上传
uploadChunks() {
// 取出当前未上传的切片
const chunk = this.chunks[this.currentChunk];
// 创建 FormData 对象用于上传
const formData = new FormData();
formData.append("file", chunk.file);
formData.append("index", this.currentChunk);
formData.append("total", this.chunks.length);
// 发送上传请求
fetch(this.uploadUrl, {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
// 上传成功后将已上传的切片索引保存到 uploadedChunks 数组中
this.uploadedChunks.push(this.currentChunk);
// 如果当前切片是最后一个切片,说明上传完成
if (this.currentChunk === this.chunks.length - 1) {
this.uploading = false;
console.log("上传完成");
return;
}
// 如果还有切片未上传,则继续上传下一个切片
this.currentChunk++;
this.uploadChunks();
})
.catch(error => {
console.error(error);
this.uploading = false;
});
},
// 将文件切片
sliceFile() {
const fileSize = this.file.size;
let current = 0;
// 切片的总数
const chunks = Math.ceil(fileSize / this.chunkSize);
while (current < fileSize) {
// 计算切片的结束位置
const end = current + this.chunkSize;
// 取出对应的切片
const chunk = this.file.slice(current, end);
// 将切片保存到 chunks 数组中
this.chunks.push({ file: chunk });
current = end;
}
},
// 执行上传
upload() {
if (!this.file) {
alert("请先选择文件");
return;
}
this.uploading = true;
this.sliceFile();
this.uploadChunks();
}
}
};
</script>
```
首先,在模板中定义一个文件选择框和一个上传按钮,这里我们使用了 Vue 的 `ref` 属性来获取选择的文件对象:
```html
<template>
<div>
<input type="file" ref="fileInput" @change="handleFileChange" />
<button @click="upload">上传</button>
</div>
</template>
```
然后,在组件的 `data` 中定义了一些上传相关的变量,包括上传的文件对象、切片大小、文件切片后的数组、当前上传的切片索引、已上传的切片索引、上传接口地址和是否正在上传等:
```javascript
export default {
data() {
return {
file: null, // 上传的文件对象
chunkSize: 1 * 1024 * 1024, // 切片大小,这里设置为 1MB
chunks: [], // 文件切片后的数组
currentChunk: 0, // 当前上传的切片索引
uploadedChunks: [], // 已上传的切片索引
uploadUrl: "/api/upload", // 上传接口地址
uploading: false // 是否正在上传
};
},
// ...
}
```
接着,定义了一些上传相关的方法,包括选择文件后将文件对象保存到 data 中、切片上传、将文件切片和执行上传等:
```javascript
export default {
// ...
methods: {
// 选择文件后将文件对象保存到 data 中
handleFileChange() {
this.file = this.$refs.fileInput.files[0];
},
// 切片上传
uploadChunks() {
// 取出当前未上传的切片
const chunk = this.chunks[this.currentChunk];
// 创建 FormData 对象用于上传
const formData = new FormData();
formData.append("file", chunk.file);
formData.append("index", this.currentChunk);
formData.append("total", this.chunks.length);
// 发送上传请求
fetch(this.uploadUrl, {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
// 上传成功后将已上传的切片索引保存到 uploadedChunks 数组中
this.uploadedChunks.push(this.currentChunk);
// 如果当前切片是最后一个切片,说明上传完成
if (this.currentChunk === this.chunks.length - 1) {
this.uploading = false;
console.log("上传完成");
return;
}
// 如果还有切片未上传,则继续上传下一个切片
this.currentChunk++;
this.uploadChunks();
})
.catch(error => {
console.error(error);
this.uploading = false;
});
},
// 将文件切片
sliceFile() {
const fileSize = this.file.size;
let current = 0;
// 切片的总数
const chunks = Math.ceil(fileSize / this.chunkSize);
while (current < fileSize) {
// 计算切片的结束位置
const end = current + this.chunkSize;
// 取出对应的切片
const chunk = this.file.slice(current, end);
// 将切片保存到 chunks 数组中
this.chunks.push({ file: chunk });
current = end;
}
},
// 执行上传
upload() {
if (!this.file) {
alert("请先选择文件");
return;
}
this.uploading = true;
this.sliceFile();
this.uploadChunks();
}
}
};
```
其中,切片上传方法中首先取出未上传的切片,然后使用 FormData 对象创建上传请求,并通过 `fetch` 函数发送请求。如果上传成功,将已上传的切片索引保存到数组中,并检查是否上传完成。如果还有切片未上传,则继续上传下一个切片。如果上传失败,则将 `uploading` 变量设置为 `false`,表示上传失败,并在控制台打印错误信息。
将文件切片的方法中,首先计算切片的总数,然后循环每个切片,并使用 `File.slice` 方法取出对应的切片,并将切片保存到数组中。
最后,执行上传方法中,首先检查是否选择了文件,然后将 `uploading` 变量设置为 `true`,表示正在上传。接着,调用 `sliceFile` 方法将文件切片,并调用 `uploadChunks` 方法上传切片。
阅读全文