Quellcode durchsuchen

解决文件上传时,判断空间容量

wukai vor 2 Jahren
Ursprung
Commit
905f1ae299
2 geänderte Dateien mit 193 neuen und 201 gelöschten Zeilen
  1. 179 161
      src/components/FileUpload/index.vue
  2. 14 40
      src/views1/File/Individual/IndividualView.vue

+ 179 - 161
src/components/FileUpload/index.vue

@@ -1,6 +1,5 @@
 <template>
   <div class="upload-file">
-    {{ residueNum }}
     <el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :limit="limit"
       :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess" :show-file-list="false"
       :headers="headers" class="upload-file-uploader" ref="fileUpload">
@@ -30,183 +29,202 @@
 </template>
 
 <script>
-import { getToken } from "@/utils/auth";
+  import {
+    getToken
+  } from "@/utils/auth";
 
-export default {
-  name: "FileUpload",
-  props: {
-    // 值
-    value: [String, Object, Array],
-    // 数量限制
-    limit: {
-      type: Number,
-      default: 5,
-    },
-    // 大小限制(MB)
-    fileSize: {
-      type: Number,
-      default: 1024,
-    },
-    // 文件类型, 例如['png', 'jpg', 'jpeg']
-    fileType: {
-      type: Array,
-      default: () => ["doc", "docx", "xls", "xlsx", "ppt", "txt", "pdf", "gz"],
-    },
-    // 是否显示提示
-    isShowTip: {
-      type: Boolean,
-      default: true
-    },
-    residueNum: {
-      type: String,
-      default: '0'
-    }
-  },
-  data() {
-    return {
-      number: 0,
-      uploadList: [],
-      uploadFileUrl: process.env.VUE_APP_BASE_API + "/file/upload", // 上传文件服务器地址
-      headers: {
-        Authorization: "Bearer " + getToken()
+  export default {
+    name: "FileUpload",
+    props: {
+      // 值
+      value: [String, Object, Array],
+      // 数量限制
+      limit: {
+        type: Number,
+        default: 1,
       },
-      fileList: []
-    }
-  },
-  watch: {
-    value: {
-      handler(val) {
-        if (val) {
-          let temp = 1;
-          // 首先将值转为数组
-          const list = Array.isArray(val) ? val : this.value.split(',');
-          // 然后将数组转为对象数组
-          this.fileList = list.map(item => {
-            if (typeof item === "string") {
-              item = { name: item, url: item }
-            }
-            item.uid = item.uid || new Date().getTime() + temp++;
-            return item
-          })
-        } else {
-          this.fileList = []
-          return []
-        }
+      // 大小限制(MB)
+      fileSize: {
+        type: Number,
+        default: 1024,
       },
-      deep: true,
-      immediate: true
-    }
-  },
-  computed: {
-    // 是否显示提示
-    showTip() {
-      return this.isShowTip && (this.fileType || this.fileSize);
-    },
-  },
-  methods: {
-    // 上传前校检格式和大小
-    handleBeforeUpload(file) {
-      // 校检文件类型
-      // if (this.fileType) {
-      //   const fileName = file.name.split('.');
-      //   const fileExt = fileName[fileName.length - 1];
-      //   const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
-      //   if (!isTypeOk) {
-      //     this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
-      //     return false;
-      //   }
-      // }
-      console.log((this.residueNum * 1024).toFixed(2), 'residue')
-      // 校检文件大小
-      if (this.fileSize) {
-        const isLt = file.size / 1024 / 1024 < (this.residueNum * 1024).toFixed(2)
-        if (!isLt) {
-          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
-          return false;
-        }
+      // 文件类型, 例如['png', 'jpg', 'jpeg']
+      fileType: {
+        type: Array,
+        default: () => ["doc", "docx", "xls", "xlsx", "ppt", "txt", "pdf", "gz"],
+      },
+      // 是否显示提示
+      isShowTip: {
+        type: Boolean,
+        default: true
+      },
+      residueNum: {
+        type: String,
+        default: '0'
       }
-      this.$modal.loading("正在上传文件,请稍候...");
-      this.number++;
-      return true;
-    },
-    // 文件个数超出
-    handleExceed() {
-      this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
-    },
-    // 上传失败
-    handleUploadError(err) {
-      this.$modal.msgError("上传文件失败,请重试");
-      this.$modal.closeLoading()
     },
-    // 上传成功回调
-    handleUploadSuccess(res, file) {
-      if (res.code === 200) {
-        this.uploadList.push({ name: res.data.url, url: res.data.url });
-        this.uploadedSuccessfully();
-      } else {
-        this.number--;
-        this.$modal.closeLoading();
-        this.$modal.msgError(res.msg);
-        this.$refs.fileUpload.handleRemove(file);
-        this.uploadedSuccessfully();
+    data() {
+      return {
+        number: 0,
+        uploadList: [],
+        uploadFileUrl: process.env.VUE_APP_BASE_API + "/file/upload", // 上传文件服务器地址
+        headers: {
+          Authorization: "Bearer " + getToken()
+        },
+        fileList: []
       }
     },
-    // 删除文件
-    handleDelete(index) {
-      this.fileList.splice(index, 1);
-      this.$emit("input", this.listToString(this.fileList));
-    },
-    // 上传结束处理
-    uploadedSuccessfully() {
-      if (this.number > 0 && this.uploadList.length === this.number) {
-        this.fileList = this.fileList.concat(this.uploadList);
-        this.uploadList = [];
-        this.number = 0;
-        this.$emit("input", this.listToString(this.fileList));
-        this.$modal.closeLoading();
+    watch: {
+      value: {
+        handler(val) {
+          if (val) {
+            let temp = 1;
+            // 首先将值转为数组
+            const list = Array.isArray(val) ? val : this.value.split(',');
+            // 然后将数组转为对象数组
+            this.fileList = list.map(item => {
+              if (typeof item === "string") {
+                item = {
+                  name: item,
+                  url: item
+                }
+              }
+              item.uid = item.uid || new Date().getTime() + temp++;
+              return item
+            })
+          } else {
+            this.fileList = []
+            return []
+          }
+        },
+        deep: true,
+        immediate: true
       }
     },
-    // 获取文件名称
-    getFileName(name) {
-      if (name.lastIndexOf("/") > -1) {
-        return name.slice(name.lastIndexOf("/") + 1);
-      } else {
-        return "";
-      }
+    computed: {
+      // 是否显示提示
+      showTip() {
+        return this.isShowTip && (this.fileType || this.fileSize);
+      },
     },
-    // 对象转成指定字符串分隔
-    listToString(list, separator) {
-      let strs = "";
-      separator = separator || ",";
-      for (let i in list) {
-        strs += list[i].url + separator;
+    methods: {
+      // 上传前校检格式和大小
+      handleBeforeUpload(file) {
+        // 校检文件类型
+        // if (this.fileType) {
+        //   const fileName = file.name.split('.');
+        //   const fileExt = fileName[fileName.length - 1];
+        //   const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
+        //   if (!isTypeOk) {
+        //     this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
+        //     return false;
+        //   }
+        // }
+        // console.log((this.residueNum * 1024).toFixed(2), 'residue')
+        
+        let size2mb = file.size / 1024 / 1024;
+        //将文件大小转换为MB。
+        //校验空间
+        if (this.residueNum) {
+          if (size2mb > this.residueNum) {
+            this.$modal.msgError(`存储空间容量剩余 ${this.residueNum} MB!,请联系管理员申请扩容后再次上传。`);
+            return false;
+          }
+        }
+
+        // 校检文件大小
+        if (this.fileSize) {
+          const isLt = size2mb < this.fileSize;
+          if (!isLt) {
+            this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
+            return false;
+          }
+        }
+        this.$modal.loading("正在上传文件,请稍候...");
+        this.number++;
+        return true;
+      },
+      // 文件个数超出
+      handleExceed() {
+        this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
+      },
+      // 上传失败
+      handleUploadError(err) {
+        this.$modal.msgError("上传文件失败,请重试");
+        this.$modal.closeLoading()
+      },
+      // 上传成功回调
+      handleUploadSuccess(res, file) {
+        if (res.code === 200) {
+          this.uploadList.push({
+            name: res.data.url,
+            url: res.data.url
+          });
+          this.uploadedSuccessfully();
+        } else {
+          this.number--;
+          this.$modal.closeLoading();
+          this.$modal.msgError(res.msg);
+          this.$refs.fileUpload.handleRemove(file);
+          this.uploadedSuccessfully();
+        }
+      },
+      // 删除文件
+      handleDelete(index) {
+        this.fileList.splice(index, 1);
+        this.$emit("input", this.listToString(this.fileList));
+      },
+      // 上传结束处理
+      uploadedSuccessfully() {
+        if (this.number > 0 && this.uploadList.length === this.number) {
+          this.fileList = this.fileList.concat(this.uploadList);
+          this.uploadList = [];
+          this.number = 0;
+          this.$emit("input", this.listToString(this.fileList));
+          this.$modal.closeLoading();
+        }
+      },
+      // 获取文件名称
+      getFileName(name) {
+        if (name.lastIndexOf("/") > -1) {
+          return name.slice(name.lastIndexOf("/") + 1);
+        } else {
+          return "";
+        }
+      },
+      // 对象转成指定字符串分隔
+      listToString(list, separator) {
+        let strs = "";
+        separator = separator || ",";
+        for (let i in list) {
+          strs += list[i].url + separator;
+        }
+        return strs != '' ? strs.substr(0, strs.length - 1) : '';
       }
-      return strs != '' ? strs.substr(0, strs.length - 1) : '';
     }
   }
-}
 </script>
 
 <style scoped lang="scss">
-.upload-file-uploader {
-  margin-bottom: 5px;
-}
+  .upload-file-uploader {
+    margin-bottom: 5px;
+  }
 
-.upload-file-list .el-upload-list__item {
-  border: 1px solid #e4e7ed;
-  line-height: 2;
-  margin-bottom: 10px;
-  position: relative;
-}
+  .upload-file-list .el-upload-list__item {
+    border: 1px solid #e4e7ed;
+    line-height: 2;
+    margin-bottom: 10px;
+    position: relative;
+  }
 
-.upload-file-list .ele-upload-list__item-content {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  color: inherit;
-}
+  .upload-file-list .ele-upload-list__item-content {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    color: inherit;
+  }
 
-.ele-upload-list__item-content-action .el-link {
-  margin-right: 10px;
-}
+  .ele-upload-list__item-content-action .el-link {
+    margin-right: 10px;
+  }
 </style>

+ 14 - 40
src/views1/File/Individual/IndividualView.vue

@@ -44,44 +44,8 @@
 
             <el-row :gutter="10" class="mb8">
               <el-col :span="1.5">
-                <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
-                  v-hasPermi="['doc:info:add']">上传</el-button>
+                <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">上传</el-button>
               </el-col>
-              <!-- <el-col :span="1.5">
-                <el-button
-                  type="success"
-                  plain
-                  icon="el-icon-edit"
-                  size="mini"
-                  :disabled="single"
-                  @click="handleUpdate"
-                  v-hasPermi="['doc:info:edit']"
-                  >修改</el-button
-                >
-              </el-col>
-              <el-col :span="1.5">
-                <el-button
-                  type="danger"
-                  plain
-                  icon="el-icon-delete"
-                  size="mini"
-                  :disabled="multiple"
-                  @click="handleDelete"
-                  v-hasPermi="['doc:info:remove']"
-                  >删除</el-button
-                >
-              </el-col>
-              <el-col :span="1.5">
-                <el-button
-                  type="warning"
-                  plain
-                  icon="el-icon-download"
-                  size="mini"
-                  @click="handleExport"
-                  v-hasPermi="['doc:info:export']"
-                  >导出</el-button
-                >
-              </el-col> -->
               <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
             </el-row>
 
@@ -136,7 +100,7 @@
           <el-form ref="form" :model="form" :rules="rules" label-width="80px">
             <el-form-item label="" prop="docPath">
               <!-- <el-input v-model="form.docPath" placeholder="请输入文件路径" /> -->
-              <file-upload v-model="form.docPath" />
+              <file-upload :residueNum="residueNum" v-model="form.docPath" />
             </el-form-item>
             <el-form-item label="文件目录" prop="dirId">
               <treeselect v-model="form.dirId" :options="dirList" :normalizer="normalizer" placeholder="请选择文件目录" />
@@ -224,7 +188,9 @@
   import {
     listLevel
   } from "@/api/doc/level";
-
+  import {
+    getPersonalSpace
+  } from '@/api/doc/space'
   import Treeselect from "@riophae/vue-treeselect";
   import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
@@ -273,6 +239,8 @@
         single: true,
         // 非多个禁用
         multiple: true,
+        //文件上传大小限制
+        residueNum: null,
         // 显示搜索条件
         showSearch: true,
         // 总条数
@@ -326,6 +294,7 @@
           }, ],
         },
       };
+
     },
     created() {
       this.dirTree();
@@ -660,6 +629,11 @@
         this.reset();
         this.open = true;
         this.title = "添加文件基本信息";
+        getPersonalSpace({}).then(res => {
+          //容量需先转换成MB
+          this.residueNum = ((res.data.spaceCap - res.data.usedCap) * 1024).toFixed(2).toString()
+          console.log(this.residueNum, 'resss')
+        })
         // this.dynamicTags=[];
         // console.log(this.dynamicTags);
       },
@@ -1088,4 +1062,4 @@
       vertical-align: bottom;
     }
   }
-</style>
+</style>