ImportFile.vue 3.9 KB

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