|
@@ -14,6 +14,7 @@
|
|
|
<el-upload
|
|
|
action=""
|
|
|
class="upload-demo"
|
|
|
+ multiple
|
|
|
:http-request="customUpload"
|
|
|
:on-change="validateAndHandleChange"
|
|
|
:before-upload="checkFileType"
|
|
@@ -102,7 +103,6 @@
|
|
|
</span>
|
|
|
</el-tooltip>
|
|
|
</span>
|
|
|
- 计算器弹出框
|
|
|
</el-tab-pane>
|
|
|
<el-tab-pane name="associatedFields">
|
|
|
<span slot="label" class="iconFont">
|
|
@@ -476,7 +476,6 @@ export default {
|
|
|
};
|
|
|
this.dialogVisible = false; // 重置表单状态
|
|
|
},
|
|
|
-
|
|
|
async storeData(newFileData) {
|
|
|
await storeSetData(this.db, "files", "fileDataArray", newFileData, () => {
|
|
|
this.setTriggerGetData(true);
|
|
@@ -503,27 +502,64 @@ export default {
|
|
|
this.activeName = tab.name;
|
|
|
}
|
|
|
},
|
|
|
+
|
|
|
// 自定义上传方法
|
|
|
customUpload(file) {
|
|
|
const formData = new FormData();
|
|
|
formData.append("file", file);
|
|
|
// 使用 axios 自定义上传逻辑
|
|
|
+ console.log("自定义上传", file.name);
|
|
|
},
|
|
|
+
|
|
|
// 验证并处理文件变化
|
|
|
- validateAndHandleChange(file) {
|
|
|
- if (this.checkFileType(file)) {
|
|
|
- this.handleChange(file); // 仅当验证通过时调用 handleChange
|
|
|
+ validateAndHandleChange(fileList) {
|
|
|
+ // 判断 fileList 是否为数组(多个文件)还是单个文件
|
|
|
+ if (Array.isArray(fileList)) {
|
|
|
+ // 如果是数组(多个文件),遍历每个文件进行处理
|
|
|
+ fileList.forEach((file) => {
|
|
|
+ if (this.checkFileType(file)) {
|
|
|
+ this.handleChange(file); // 验证通过后逐一处理
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ // 如果是单个文件,直接处理
|
|
|
+ if (this.checkFileType(fileList)) {
|
|
|
+ this.handleChange(fileList);
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
- // 文件变化时的处理
|
|
|
- handleChange(file) {
|
|
|
- this.checkFileType(file);
|
|
|
|
|
|
+ // 检查文件类型&多个文件选择,但多个文件总数大小不能超过50KB
|
|
|
+ checkFileType(file) {
|
|
|
+ // 判断文件类型
|
|
|
+ const isValidType =
|
|
|
+ file.type === "text/csv" ||
|
|
|
+ file.name.endsWith(".csv") ||
|
|
|
+ file.type ===
|
|
|
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
|
|
|
+ file.name.endsWith(".xlsx") ||
|
|
|
+ file.name.endsWith(".xls");
|
|
|
+
|
|
|
+ if (!isValidType) {
|
|
|
+ this.$message.error("只能上传csv文件或xlsx或xls文件");
|
|
|
+ return false; // 返回false,阻止上传
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断文件大小(以字节为单位,50KB = 51200字节)
|
|
|
+ const maxSize = 50 * 1024; // 50KB
|
|
|
+ if (file.size > maxSize) {
|
|
|
+ this.$message.error("文件大小不能超过50KB");
|
|
|
+ return false; // 返回false,阻止上传
|
|
|
+ }
|
|
|
+ return true; // 如果验证通过,允许上传
|
|
|
+ },
|
|
|
+
|
|
|
+ // 处理文件
|
|
|
+ handleChange(file) {
|
|
|
// 如果是 CSV 文件
|
|
|
- if (file && file.name.endsWith(".csv")) {
|
|
|
+ if (file.name.endsWith(".csv")) {
|
|
|
const reader = new FileReader();
|
|
|
reader.onload = (e) => {
|
|
|
- // 检测文件编码并解析
|
|
|
const encoding = this.detectFileEncoding(e.target.result);
|
|
|
const text = new TextDecoder(encoding).decode(
|
|
|
new Uint8Array(e.target.result)
|
|
@@ -537,7 +573,8 @@ export default {
|
|
|
filename: format(new Date(), "yyyyMMdd-HH:mm:ss") + file.name,
|
|
|
fileOldName: file.name,
|
|
|
fileData: results.data,
|
|
|
- fileId: new Date().getTime(),
|
|
|
+ fileId:
|
|
|
+ new Date().getTime() + "_" + Math.floor(Math.random() * 1000),
|
|
|
};
|
|
|
if (results.data.length > 0) {
|
|
|
this.storeData(fileData);
|
|
@@ -550,7 +587,7 @@ export default {
|
|
|
},
|
|
|
});
|
|
|
};
|
|
|
- reader.readAsArrayBuffer(file.raw); // 以 ArrayBuffer 读取文件
|
|
|
+ reader.readAsArrayBuffer(file.raw);
|
|
|
} else {
|
|
|
// 如果是 Excel 文件
|
|
|
const reader = new FileReader();
|
|
@@ -581,43 +618,17 @@ export default {
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
- reader.readAsArrayBuffer(file.raw); // 以 ArrayBuffer 读取文件
|
|
|
+ reader.readAsArrayBuffer(file.raw);
|
|
|
}
|
|
|
},
|
|
|
-
|
|
|
// 检测文件编码的方法
|
|
|
detectFileEncoding(arrayBuffer) {
|
|
|
- // 简单判断编码,默认 UTF-8,如果需要更精确,可以引入第三方库如 `jschardet`
|
|
|
const text = new TextDecoder("utf-8").decode(new Uint8Array(arrayBuffer));
|
|
|
if (text.includes("�")) {
|
|
|
- // 如果有乱码字符,可能是 GBK 编码
|
|
|
- return "gbk";
|
|
|
+ return "gbk"; // 如果有乱码字符,可能是 GBK 编码
|
|
|
}
|
|
|
return "utf-8";
|
|
|
},
|
|
|
-
|
|
|
- //判断上传文件类型
|
|
|
- checkFileType(file) {
|
|
|
- const isPdf =
|
|
|
- file.type === "text/csv" ||
|
|
|
- file.name.endsWith(".csv") ||
|
|
|
- file.type ===
|
|
|
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
|
|
|
- file.name.endsWith(".xlsx") ||
|
|
|
- file.name.endsWith(".xls");
|
|
|
- if (!isPdf) {
|
|
|
- this.$message.error("只能上传csv文件或xlsx或xls文件");
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 判断文件大小(以字节为单位,100kB = 102400字节)
|
|
|
- const maxSize = 50 * 1024; // 100kB
|
|
|
- if (file.size > maxSize) {
|
|
|
- this.$message.error("文件大小不能超过50kB");
|
|
|
- return false;
|
|
|
- }
|
|
|
- this.loading = true;
|
|
|
- return true;
|
|
|
- },
|
|
|
},
|
|
|
async mounted() {
|
|
|
await this.initDB(); // 初始化数据库
|
|
@@ -643,8 +654,11 @@ export default {
|
|
|
.popover-footer {
|
|
|
text-align: right;
|
|
|
}
|
|
|
- .iconFont {
|
|
|
+ ::v-deep .iconFont {
|
|
|
padding: 0 20px;
|
|
|
+ width: 100% !important;
|
|
|
+ height: 100% !important;
|
|
|
+ display: inline-block;
|
|
|
}
|
|
|
|
|
|
::v-deep .el-tabs__content {
|