ImportFile.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <div :class="prefixCls">
  3. <el-dialog
  4. class="modify-data"
  5. :visible.sync="modalIsShow"
  6. :title="title"
  7. top="10vh"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @open="visibleChange"
  12. >
  13. <div style="footer"></div>
  14. <div :class="[`${prefixCls}-body`]">
  15. <el-upload
  16. drag
  17. :action="uploadUrl"
  18. :headers="headers"
  19. :max-size="maxSize"
  20. :format="format"
  21. :accept="accept"
  22. :data="uploadData"
  23. :before-upload="handleBeforeUpload"
  24. :on-error="handleError"
  25. :on-success="handleSuccess"
  26. :on-remove="handleRemove"
  27. ref="UploadComp"
  28. >
  29. <i class="el-icon-upload"></i><br />
  30. <em class="el-upload__text">将文件拖到此处,或<em>点击上传</em></em>
  31. <p
  32. slot="tip"
  33. :class="[
  34. `${prefixCls}-tips`,
  35. {
  36. 'cc-tips-success': res.success,
  37. 'cc-tips-error': !res.success
  38. }
  39. ]"
  40. v-if="res.msg"
  41. >
  42. {{ res.msg }}
  43. </p>
  44. </el-upload>
  45. </div>
  46. <div :class="[`${prefixCls}-footer`]" v-if="downloadUrl">
  47. 文件下载:
  48. <a :href="downloadUrl" :download="dfilename">{{ dfilename }}</a>
  49. </div>
  50. </el-dialog>
  51. </div>
  52. </template>
  53. <script>
  54. const prefixCls = "cc-import-file";
  55. export default {
  56. name: "import-file",
  57. props: {
  58. title: {
  59. type: String,
  60. default: "文件上传"
  61. },
  62. downloadUrl: {
  63. type: String,
  64. default: ""
  65. },
  66. downloadFilename: String,
  67. format: {
  68. type: Array,
  69. default() {
  70. return ["jpg", "jpeg", "png"];
  71. }
  72. },
  73. uploadUrl: {
  74. type: String,
  75. required: true
  76. },
  77. uploadData: {
  78. type: Object,
  79. default() {
  80. return {};
  81. }
  82. },
  83. headers: {
  84. type: Object,
  85. default() {
  86. return {};
  87. }
  88. },
  89. maxSize: {
  90. type: Number,
  91. default: 10 * 1024 * 1024
  92. },
  93. addFilenameParam: {
  94. type: String,
  95. default: "fileName"
  96. }
  97. },
  98. data() {
  99. return {
  100. prefixCls,
  101. modalIsShow: false,
  102. res: {
  103. success: true,
  104. msg: ""
  105. }
  106. };
  107. },
  108. computed: {
  109. dfilename() {
  110. return this.downloadFilename || this.downloadUrl.split("/").pop();
  111. },
  112. accept() {
  113. return this.format.map(el => `.${el}`).join();
  114. }
  115. },
  116. methods: {
  117. visibleChange() {
  118. this.res = {
  119. success: true,
  120. msg: ""
  121. };
  122. },
  123. checkFileFormat(fileType) {
  124. const _file_format = fileType
  125. .split("/")
  126. .pop()
  127. .toLocaleLowerCase();
  128. return this.format.some(
  129. item => item.toLocaleLowerCase() === _file_format
  130. );
  131. },
  132. handleBeforeUpload(file) {
  133. if (this.addFilenameParam)
  134. this.uploadData[this.addFilenameParam] = file.name;
  135. if (file.size > this.maxSize) {
  136. this.handleExceededSize();
  137. return Promise.reject();
  138. }
  139. if (!this.checkFileFormat(file.type)) {
  140. this.handleFormatError();
  141. return Promise.reject();
  142. }
  143. return true;
  144. },
  145. handleError(error) {
  146. this.res = {
  147. success: false,
  148. msg: error.message
  149. };
  150. this.$emit("upload-error", error);
  151. },
  152. handleSuccess(response) {
  153. this.res = {
  154. success: true,
  155. msg: "导入成功!"
  156. };
  157. this.$emit("upload-success", response);
  158. },
  159. handleFormatError() {
  160. this.res = {
  161. success: false,
  162. msg: "只支持文件格式为" + this.format.join("/")
  163. };
  164. this.$refs.UploadComp.clearFiles();
  165. },
  166. handleExceededSize() {
  167. this.res = {
  168. success: false,
  169. msg: "文件大小不能超过" + Math.floor(this.maxSize / 1024) + "M"
  170. };
  171. this.$refs.UploadComp.clearFiles();
  172. },
  173. handleRemove() {
  174. this.$refs.UploadComp.abort();
  175. this.$refs.UploadComp.clearFiles();
  176. },
  177. cancel() {
  178. this.modalIsShow = false;
  179. },
  180. open() {
  181. this.modalIsShow = true;
  182. }
  183. }
  184. };
  185. </script>