index2.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <template>
  2. <div class="clearfix">
  3. <a-upload
  4. v-model:file-list="fileList"
  5. list-type="picture"
  6. :multiple="true"
  7. :accept="accept"
  8. @remove="remove"
  9. :beforeUpload="change"
  10. @preview="handlePreview"
  11. >
  12. <a-button>
  13. <upload-outlined></upload-outlined>
  14. upload
  15. </a-button>
  16. </a-upload>
  17. <a-modal :visible="previewVisible" :title="previewTitle" :footer="null" @cancel="previewVisible=false;previewTitle=''" width="1000px">
  18. <img alt="example" style="width: 100%" v-if="previewImage" :src="previewImage" />
  19. <video :src="previewVideo" v-if="previewVideo" controls></video>
  20. </a-modal>
  21. </div>
  22. </template>
  23. <script setup>
  24. import { UploadOutlined } from '@ant-design/icons-vue';
  25. import { PlusOutlined } from '@ant-design/icons-vue';
  26. import {ref, defineProps, defineEmits, onMounted} from 'vue'
  27. import Api from '@/api/api'
  28. import Up from '@/api/upload'
  29. import utils from '@/utils/utils'
  30. const emit = defineEmits(['uploadSuccess'])
  31. const props = defineProps({
  32. id:String,
  33. text:String,
  34. bindData:Object,
  35. accept: {
  36. type:String,
  37. default:() => {
  38. return ''
  39. }
  40. }
  41. })
  42. const previewVisible = ref(false)
  43. const previewImage = ref('')
  44. const previewVideo = ref('')
  45. const previewTitle = ref('')
  46. let fileList = ref([])
  47. let currentIndex = ref(0)
  48. let callback = ref('')
  49. const handlePreview = async file => {
  50. previewImage.value = false
  51. previewVideo.value = false
  52. console.log(file);
  53. if (!file.url && !file.preview) {
  54. file.preview = await getBase64(file.originFileObj)
  55. }
  56. if (file.postfix && 'mp4 avi mov wmv rmvb mkv m4v'.indexOf(file.postfix) != -1) {
  57. previewVideo.value = file.url || file.preview
  58. previewVisible.value = true
  59. } else if (file.postfix && 'bmp jpg png tif gif pcx tga exif fpx svg psd cdr pcd dxf ufo eps ai raw WMF webp avif apng'.indexOf(file.postfix) != -1) {
  60. previewImage.value = file.url || file.preview
  61. previewVisible.value = true
  62. } else {
  63. console.log('触发',file);
  64. window.open(file.url || file.preview,'_self')
  65. }
  66. previewTitle.value = file.name || file.url.substring(file.url.lastIndexOf('/') + 1)
  67. }
  68. function getBase64(file) {
  69. return new Promise((resolve, reject) => {
  70. const reader = new FileReader()
  71. reader.readAsDataURL(file)
  72. reader.onload = () => resolve(reader.result)
  73. reader.onerror = error => reject(error)
  74. })
  75. }
  76. /* 主动上传 */
  77. let change = (file) => {
  78. if (Object.keys(props.bindData).length) {
  79. fileList.value = [...fileList.value,file]
  80. let index = file.name.lastIndexOf(".");
  81. let type = file.name.substr(index + 1);
  82. getUploadUrl(file.name, type,file)
  83. }
  84. return false
  85. }
  86. /* 外部触发上传 */
  87. let toUpload = (fun) => {
  88. callback.value = fun
  89. console.log(callback.value);
  90. currentIndex.value = 0
  91. fileList.value.forEach(file=>{
  92. let index = file.originFileObj.name.lastIndexOf(".");
  93. let type = file.originFileObj.name.substr(index + 1);
  94. getUploadUrl(file.name, type,file.originFileObj)
  95. })
  96. }
  97. const getUploadUrl = async (filename,type,file)=>{
  98. const res = await Api.requested({
  99. "classname": "system.attachment.huawei.OBS",
  100. "method": "getFileName",
  101. "content": {
  102. "filename": filename,
  103. "filetype": type,
  104. "parentid": appfolderid.value//归属文件夹ID
  105. }
  106. })
  107. let url = res.data.uploadurl
  108. let obsfilename = res.data.serialfilename
  109. upoladFileToServer(url, file, type, obsfilename)
  110. }
  111. const setProgress = (percent)=>{
  112. return {
  113. strokeColor: {
  114. '0%': '#108ee9',
  115. '100%': '#87d068',
  116. },
  117. strokeWidth: 3,
  118. format: percent => `${parseFloat(percent.toFixed(2))}%`,
  119. class: 'test',
  120. };
  121. }
  122. const upoladFileToServer = async (url, file, ext, obsfilename)=> {
  123. let config = {
  124. headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : ext === 'svg'?{ 'Content-Type': 'image/svg+xml' } : { 'Content-Type': 'application/octet-stream' },
  125. onUploadProgress: function (progressEvent) {
  126. let percent = progressEvent.loaded / progressEvent.total * 100
  127. fileList.value = fileList.value.map((e,index) => {
  128. if (e.uid === file.uid) {
  129. e = { ...e, percent: percent.toFixed(0) }
  130. }
  131. return e
  132. })
  133. },
  134. }
  135. await Up.upload(url, file, config)
  136. createFileRecord(obsfilename)
  137. }
  138. // 上传成功以后生成附件记录
  139. const createFileRecord = async (obsfilename)=> {
  140. let obj = {
  141. "serialfilename": obsfilename
  142. }
  143. obj = Object.assign({},obj,props.bindData)
  144. let param = {
  145. "classname": "system.attachment.huawei.OBS",
  146. "method": "uploadSuccess",
  147. "content":obj
  148. }
  149. const res = await Api.requested(param)
  150. emit('uploadSuccess',res)
  151. currentIndex.value++
  152. if (currentIndex.value >= fileList.value.length) {
  153. callback.value && callback.value()
  154. currentIndex.value = 0
  155. }
  156. if (Object.keys(props.bindData).length) {
  157. let data = JSON.parse(res.attinfos)
  158. fileList.value[fileList.value.length - 1].linksid = data.data[data.data.length - 1].linksid
  159. }
  160. }
  161. let remove = async (data) => {
  162. let res = await Api.requested({
  163. "classname": "system.attachment.Attachment",
  164. "method": "deleteFileLink",
  165. "content": {
  166. "linksids": [
  167. data.linksid
  168. ]
  169. }
  170. })
  171. utils.message(res,'删除成功',() => {
  172. // fileList.value.splice(fileList.value.findIndex(item => item == data),1)
  173. console.log(fileList.value);
  174. emit('deleteSuccess')
  175. })
  176. }
  177. const appfolderid = ref('')
  178. const salematerialfolderid = ref('')
  179. const querySite_Parameter = async ()=> {
  180. const res = await Api.requested({
  181. "id":20230608103802,
  182. "content": {}
  183. })
  184. appfolderid.value = res.data.appfolderid, // 应用附件文件夹ID
  185. salematerialfolderid.value = res.data.salematerialfolderid // 营销物文件夹ID
  186. }
  187. let refresh = () => {
  188. fileList.value = []
  189. }
  190. onMounted(() => {
  191. querySite_Parameter()
  192. })
  193. defineExpose({
  194. toUpload,
  195. fileList,
  196. refresh
  197. })
  198. </script>
  199. <style scoped>
  200. /deep/.ant-upload-list-item-error {
  201. border-color: #d9d9d9 !important;
  202. }
  203. </style>