- 安装spark-md5用来校验文件内容,禁止上传文件内容一致的文件
npm install spark-md5
# 或者
yarn add spark-md5
- 安装opencc-js,将上传的文件名称由繁体改为简体
npm install opencc-js
- upload上传组件(自行安装并在main.js中use使用element-ui即可)
<template>
<div>
<el-upload
class="upload"
drag
action=""
:auto-upload="false"
:show-file-list="false"
:on-change="handleFileChange"
:http-request="uploadFile"
multiple
ref="upload"
>
<div class="icon-upload"></div>
<div class="upload-btn"></div>
<div class="el-upload__text">将文件拖到此处或<em>点击上传</em></div>
</el-upload>
<div class="file-list-container" v-if="selectedFiles.length > 0">
<div class="file-list-header">已选文件</div>
<div class="file-list-grid">
<div
class="file-item"
v-for="(file, index) in selectedFiles"
:key="index"
>
<span class="file-name">{{ file.name }}</span>
<el-button
class="delete-btn"
type="text"
icon="el-icon-delete"
@click.stop="removeSingleFile(index, file.name)"
></el-button>
</div>
</div>
</div>
</div>
</template>
- JS方法逻辑
<script>
import SparkMD5 from "spark-md5";
import { Converter } from "opencc-js";
export default {
data() {
return {
fileListData: [],
selectedFiles: [],
};
},
methods: {
async handleFileChange(file, fileList) {
const converter = await Converter({ from: "hk", to: "cn" });
const simplifiedName = converter(file.name);
const md5 = await this.calculateFileMD5(file.raw);
const duplicateContent = this.fileListData.some((f) => f.md5 === md5);
if (duplicateContent) {
this.$message.warning("请勿上传内容相同的文件");
return;
}
const duplicateName = this.fileListData.some(
(f) => f.name === simplifiedName
);
if (duplicateName) {
this.$message.warning("请勿上传相同名称的文件");
return;
}
const newFile = new File([file.raw], simplifiedName, {
type: file.raw.type,
lastModified: file.raw.lastModified,
});
this.fileListData.push({
...file,
name: simplifiedName,
raw: newFile,
md5,
});
this.selectedFiles = this.fileListData.map((f) => f.raw);
},
uploadFile(file) {
this.fileData.push(file);
},
removeSingleFile(index, filename) {
this.selectedFiles.splice(index, 1);
this.$refs.upload.uploadFiles.splice(index, 1);
this.fileListData = this.fileListData.filter((file) => {
return file.name !== filename;
});
},
async calculateFileMD5(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = function (e) {
const spark = new SparkMD5();
spark.appendBinary(e.target.result);
resolve(spark.end());
};
reader.onerror = function () {
reject("文件读取失败");
};
reader.readAsBinaryString(file);
});
},
},
};
</script>