fileuploads.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. <template>
  2. <div class="webuploader-container">
  3. <div :id="'uploader' + upId">
  4. <el-row>
  5. <!-- <div class="btntext upname wenjian">{{ gfname }}</div> -->
  6. <div
  7. class="btntext upname"
  8. :id="'picker' + upId"
  9. style="width: 28px; height: 24px"
  10. >
  11. <img :src="imgSrc" alt="upload icon" class="custom-icon" />
  12. </div>
  13. </el-row>
  14. <!-- <el-row v-for="(fileObj, key) in files" :key="key" class="disflex">
  15. <el-col :span="6">{{ fileObj.name }} </el-col>
  16. <el-col :span="8"
  17. ><el-progress :percentage="fileObj.percentage"></el-progress
  18. ></el-col>
  19. <el-col :span="5">{{ fileObj.msg }}</el-col>
  20. <el-col :span="5">
  21. <el-button
  22. type="danger"
  23. @click="fileDel(fileObj.id)"
  24. :icon="Delete"
  25. circle
  26. /></el-col>
  27. </el-row> -->
  28. <!-- <el-button size="mini" @click="uploader.upload()">开始上传</el-button> -->
  29. </div>
  30. </div>
  31. </template>
  32. <script setup>
  33. import $ from "jquery"
  34. // import WebUploader from 'webuploader';
  35. import store from "@/store"
  36. import { request, uploadFile } from "@/utils/request"
  37. import { ElMessage, ElButton, ElDialog } from "element-plus"
  38. import { Check, Delete, Edit, Message, Search, Star } from "@element-plus/icons-vue"
  39. const props = defineProps({
  40. projectId: Number,
  41. solverType: String,
  42. accept: String,
  43. upId: String,
  44. name: String,
  45. namelist: Array, //文件名的集合
  46. gfname: String,
  47. imgSrc: String // 按钮logo
  48. })
  49. let emit = defineEmits(["Gassaddgfid", "Gassaddbfid", "upload-success", "update-fileName", "update-percentage","upload-status"])
  50. let runupboolen = ref(true)
  51. let uploader = ref(undefined)
  52. let fileName = ref(undefined)
  53. let md5 = ref("1212")
  54. let files = ref([])
  55. let gfid = ref("")
  56. let bfid = ref("")
  57. let msg = ref()
  58. let nmllist = ref([])
  59. let gridFileId = ref("")
  60. let boundaryFileId = ref("")
  61. let uuid = ref("")
  62. let nmlid = ref("")
  63. let hcfdBoundarys = ref([])
  64. onMounted(() => {
  65. initup()
  66. })
  67. const initup = () => {
  68. getUUID()
  69. uuid.value = getUUID()
  70. console.log('uuid.value',uuid.value);
  71. initWebUploader()
  72. }
  73. const getUUID = () => {
  74. return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function (c) {
  75. var r = (Math.random() * 16) | 0,
  76. v = c == "x" ? r : (r & 0x3) | 0x8
  77. return v.toString(16)
  78. })
  79. }
  80. //fembdf绑定
  81. const fembdf = (bfid) => {
  82. let params = {
  83. transCode: "FEM001",
  84. pid: props.projectId,
  85. gridFileId: bfid
  86. }
  87. request(params)
  88. .then((res) => {
  89. console.log("绑定成功")
  90. })
  91. .catch((err) => {})
  92. }
  93. const initWebUploader = () => {
  94. files.value = []
  95. uploader.value = WebUploader.create({
  96. // swf文件路径
  97. swf: "./js/Uploader.swf",
  98. // 文件接收服务端。
  99. server: import.meta.env.VITE_BASE_URL + "/TransServlet",
  100. //文件上传请求的参数表,每次发送都会发送此对象中的参数。
  101. formData: {},
  102. // 选择文件的按钮。可选。
  103. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
  104. pick: {
  105. id: "#picker" + props.upId,
  106. multiple: false
  107. },
  108. // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  109. resize: false,
  110. // 开起分片上传。
  111. chunked: true,
  112. chunkSize: 2 * 1024 * 1024, // 2M
  113. threads: 4
  114. })
  115. // 当有文件被添加进队列的时候
  116. uploader.value.on("fileQueued", (file) => {
  117. fileName.value = file.name
  118. console.log('fileName.value', fileName.value)
  119. emit('update-fileName', fileName.value)
  120. // 文件上传类型
  121. if (props.accept && props.accept.trim() !== "") {
  122. const ext = fileName.value.split('.').pop().toLowerCase();
  123. const acceptList = props.accept.split(',').map(e => e.trim().toLowerCase());
  124. if (!acceptList.includes('.' + ext)) {
  125. uploader.value.reset();
  126. ElMessage.error(`只支持 ${props.accept} 格式文件!`);
  127. return;
  128. }
  129. }
  130. uploader.value
  131. .md5File(file)
  132. .progress((percentage) => {
  133. //显示加密进度
  134. console.log("Percentage:", percentage)
  135. })
  136. .then((hash) => {
  137. // 完成
  138. md5.value = hash
  139. })
  140. if (files.value.length > 0) {
  141. uploader.value.removeFile(files.value[0].id)
  142. files.value = []
  143. }
  144. files.value.push({
  145. id: file.id,
  146. name: file.name,
  147. msg: "等待上传...",
  148. percentage: 0
  149. })
  150. uploader.value.upload()
  151. })
  152. /**文件发送前
  153. * object {Object}
  154. data {Object}默认的上传参数,可以扩展此对象来控制上传参数。
  155. headers {Object}可以扩展此对象来控制上传头部
  156. */
  157. uploader.value.on("uploadBeforeSend", (file, data, headers) => {
  158. data.chunk = file.chunk
  159. data.chunks = file.chunks
  160. data.bfid = uuid.value
  161. data.fileName = fileName.value
  162. // data.fid=v_this.projectId;
  163. // data.solverType=v_this.solverType;
  164. // data.md5=v_this.md5;
  165. // data.uploadFlag=2;//1 普通 2覆盖 3续传
  166. data.channelNo = "service"
  167. data.clientToken = "e47b87eec69545559d1e81e56626da68"
  168. data.transCode = "B00028"
  169. data.userId = "5f06c8bc77234f969d13e160b54c27e3"
  170. headers.Content = "multipart"
  171. headers.Type = "form-data"
  172. })
  173. // 文件上传过程中创建进度条实时显示。
  174. uploader.value.on("uploadProgress", (file, percentage) => {
  175. let prage = Math.floor(percentage * 100)
  176. files.value.forEach((fileObj) => {
  177. if ((fileObj.id === file.id)) {
  178. fileObj.msg = "上传中"
  179. emit('upload-status', "上传中")
  180. }
  181. msg.value = fileObj.msg
  182. fileObj.percentage = prage
  183. // 更新进度条
  184. emit('update-percentage', prage);
  185. })
  186. })
  187. uploader.value.on("uploadSuccess", (file, response) => {
  188. console.log("文件信息:", file)
  189. console.log("返回值:", response)
  190. gridFileId.value = response.bfid
  191. let params = {
  192. transCode: "B00029",
  193. bfid: response.bfid
  194. }
  195. request(params)
  196. .then((res) => {
  197. console.log(res)
  198. files.value.forEach((fileObj) => {
  199. if (fileObj.id === file.id) {
  200. fileObj.msg = "已上传"
  201. emit('upload-status', "上传成功")
  202. emit("upload-success", {
  203. bfid: response.bfid,
  204. fname: file.name,
  205. })
  206. uuid.value = getUUID()
  207. msg.value = fileObj.msg
  208. runupboolen.value = false
  209. }
  210. if (file.ext == "x") {
  211. gfid.value = response.bfid
  212. emit("Gassaddgfid", gfid.value)
  213. } else if (file.ext == "inp") {
  214. bfid.value = response.bfid
  215. emit("Gassaddbfid", bfid.value)
  216. }
  217. })
  218. })
  219. .catch((err) => {})
  220. })
  221. //
  222. /**
  223. * 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为false, 则此文件将派送server类型的uploadError事件。
  224. * object {Object}
  225. ret {Object}服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析
  226. */
  227. uploader.value.on("uploadAccept", (object, res) => {
  228. if (res.returnCode == "000000000") {
  229. return true
  230. } else {
  231. ElMessage.error(res.returnMsg)
  232. return false
  233. }
  234. })
  235. uploader.value.on("uploadError", (file, reason) => {
  236. $("#" + file.id).text(file.name + "上传出错")
  237. emit('upload-status', "上传失败")
  238. getUUID()
  239. uuid.value = getUUID()
  240. })
  241. uploader.value.on("uploadComplete", (file) => {
  242. // $( '#'+file.id ).find('.progress').fadeOut();
  243. })
  244. }
  245. const uploaderClear = () => {
  246. uploader.value.reset();
  247. files.value = [];
  248. files.value.forEach(file => file.percentage = 0);
  249. };
  250. const fileDel = (fileId) => {
  251. console.log(fileId)
  252. getUUID()
  253. uuid.value = getUUID()
  254. files.value = files.value.filter((fileObj) => {
  255. if (fileObj.id == fileId) {
  256. console.log(fileObj)
  257. fileObj.name = fileObj.name
  258. msg.value = ""
  259. uploader.value.removeFile(fileId)
  260. }
  261. return fileObj.id != fileId
  262. })
  263. }
  264. defineExpose({ gfid, bfid, initWebUploader, files, msg })
  265. </script>
  266. <style>
  267. .webuploader-container {
  268. position: relative;
  269. }
  270. .webuploader-pick {
  271. color: #fff !important;
  272. }
  273. .webuploader-element-invisible {
  274. position: absolute !important;
  275. clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
  276. clip: rect(1px, 1px, 1px, 1px);
  277. }
  278. .webuploader-pick {
  279. position: relative;
  280. display: inline-block;
  281. cursor: pointer;
  282. padding: 1px 2px;
  283. font-size: 12px;
  284. color: #606266;
  285. text-align: center;
  286. border-radius: 3px;
  287. overflow: hidden;
  288. }
  289. .webuploader-pick-hover {
  290. background: #00a2d4;
  291. }
  292. .webuploader-pick-disable {
  293. opacity: 0.6;
  294. pointer-events: none;
  295. }
  296. .disflex {
  297. display: flex;
  298. }
  299. .text_color .webuploader-pick {
  300. color: #d5d5d5;
  301. }
  302. /* .el-progress__text {
  303. color: #d5d5d5 !important;
  304. } */
  305. .disflex .el-col {
  306. color: #fff;
  307. }
  308. .disflex .el-icon {
  309. font-size: 20px;
  310. }
  311. .wenjian {
  312. color: #fff;
  313. padding-right: 10px;
  314. }
  315. .webuploader-container .el-icon {
  316. color: #fff;
  317. }
  318. .custom-icon {
  319. width: 100%;
  320. height: auto;
  321. display: block;
  322. }
  323. </style>