diff --git a/src/utils/index.js b/src/utils/index.js index 792ed76a..2cf77d16 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -196,4 +196,30 @@ export function workSpeedclose(isForce = false) { lastPercentage = 0; imageId = null; percentageById = {}; +} +export async function readEntry(entry) { + const files = []; + + // 如果是文件夹,创建读取器并递归读取其内容 + if (entry.isDirectory) { + const directoryReader = entry.createReader(); + const entries = await new Promise((resolve, reject) => { + directoryReader.readEntries(resolve, reject); // readEntries是异步的 + }); + + // 递归读取文件夹内的每一项 + for (const subEntry of entries) { + const subFiles = await readEntry(subEntry); + files.push(...subFiles); + } + } + // 如果是文件,则将其转换为File对象 + else if (entry.isFile) { + const file = await new Promise((resolve, reject) => { + entry.file(resolve, reject); // entry.file()是异步的 + }); + files.push(file); + } + + return files; } \ No newline at end of file diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue index 7a61f8f9..22cfa3d6 100644 --- a/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue +++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue @@ -30,49 +30,52 @@ - - - - - - - - - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
@@ -91,6 +94,7 @@ import baseModel from '@/components/BaseModel' import { deepClone } from '@/utils/index.js' import store from '@/store' +import { readEntry } from '@/utils/index' export default { name: 'uploadFiles', props: { @@ -131,16 +135,41 @@ export default { } }, methods: { + handleDragover(e) { + e.stopPropagation(); + e.preventDefault(); + }, + handleDrop(e) { + e.stopPropagation(); + e.preventDefault(); + this.beginScanFiles(e, true) + }, // 获取待上传文件信息 handleSelectionChange(selection) { this.selectArr = selection }, // 扫描待上传文件 - beginScanFiles(e) { + async beginScanFiles(e, isDrop = false) { if (this.fileInput) { this.fileInput = null } - var files = [...e.target.files] + var files = [] + if (isDrop) { + const items = e.dataTransfer.items; + const allFiles = []; // 用于存储所有找到的文件 + + // 遍历拖拽项 + for (const item of items) { + const entry = item.webkitGetAsEntry(); // 获取文件系统入口 + if (entry) { + const files = await readEntry(entry); // 递归读取入口内容 + allFiles.push(...files); + } + } + files = allFiles + } else { + files = [...e.target.files] + } if (this.limitLength && this.fileList.length >= this.limitLength) return this.$message.warning( this.$t('trials:trialDocument:message:limitLength') diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue index 28c0101b..dbbc8e51 100644 --- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue +++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadClinicalData.vue @@ -2,8 +2,8 @@
@@ -180,32 +180,36 @@ " />
- - - - - - - + + + + + + + +
+
@@ -274,6 +278,7 @@ import PreviousFiles from "./previousFiles"; import clinicalDataQuestions from "@/components/clinicalDataQuestions"; import PreviewFile from "@/components/PreviewFile/index"; import moment from "moment"; +import { readEntry } from '@/utils/index' export default { name: "ClinicalData", components: { @@ -333,14 +338,39 @@ export default { this.getClinicalData(); }, methods: { - beginScanFiles(e, id, clinicalDataTrialSetId) { + handleDragover(e) { + e.stopPropagation(); + e.preventDefault(); + }, + handleDrop(e, id, clinicalDataTrialSetId) { + e.stopPropagation(); + e.preventDefault(); + this.beginScanFiles(e, id, clinicalDataTrialSetId, true) + }, + async beginScanFiles(e, id, clinicalDataTrialSetId, isDrop = false) { this.currentRow = { Id: id, ClinicalDataTrialSetId: clinicalDataTrialSetId, SubjectId: this.data.SubjectId, }; this.currentRow.TrialId = this.$route.query.trialId; - var files = e.target.files; + var files = []; + if (isDrop) { + const items = e.dataTransfer.items; + const allFiles = []; // 用于存储所有找到的文件 + + // 遍历拖拽项 + for (const item of items) { + const entry = item.webkitGetAsEntry(); // 获取文件系统入口 + if (entry) { + const files = await readEntry(entry); // 递归读取入口内容 + allFiles.push(...files); + } + } + files = allFiles + } else { + files = e.target.files + } this.fileList = []; for (var i = 0; i < files.length; ++i) { const fileName = files[i].name; diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue index 839190c1..cb076822 100644 --- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue +++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue @@ -142,257 +142,259 @@
- - - - - - - -