You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

MinioUploader.vue 7.7 kB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <template>
  2. <div class="dropzone-wrapper dataset-files">
  3. <div
  4. id="dataset"
  5. class="dropzone"
  6. />
  7. <p class="upload-info">
  8. {{ file_status_text }}
  9. <span class="success">{{ status }}</span>
  10. </p>
  11. </div>
  12. </template>
  13. <script>
  14. /* eslint-disable eqeqeq */
  15. // import Dropzone from 'dropzone/dist/dropzone.js';
  16. // import 'dropzone/dist/dropzone.css'
  17. import SparkMD5 from 'spark-md5';
  18. import axios from 'axios';
  19. import qs from 'qs';
  20. // import esdk-obs-nodejs from 'esdk-obs-nodejs';
  21. // import * as ObsClient from 'esdk-obs-nodejs'
  22. import createDropzone from '../features/dropzone.js';
  23. const {_AppSubUrl, _StaticUrlPrefix, csrf} = window.config;
  24. export default {
  25. data() {
  26. return {
  27. dropzoneUploader: null,
  28. maxFiles: 1,
  29. maxFilesize: 1 * 1024 * 1024 * 1024 * 1024,
  30. acceptedFiles: '*/*',
  31. progress: 0,
  32. status: '',
  33. dropzoneParams: {},
  34. file_status_text: ''
  35. };
  36. },
  37. async mounted() {
  38. this.dropzoneParams = $('div#minioUploader-params');
  39. this.file_status_text = this.dropzoneParams.data('file-status');
  40. this.status = this.dropzoneParams.data('file-init-status');
  41. let previewTemplate = '';
  42. previewTemplate += '<div class="dz-preview dz-file-preview">\n ';
  43. previewTemplate += ' <div class="dz-details">\n ';
  44. previewTemplate += ' <div class="dz-filename">';
  45. previewTemplate +=
  46. ' <span data-dz-name data-dz-thumbnail></span>';
  47. previewTemplate += ' </div>\n ';
  48. previewTemplate += ' <div class="dz-size" data-dz-size></div>\n ';
  49. previewTemplate += ' </div>\n ';
  50. previewTemplate += ' <div class="dz-progress ui active progress">';
  51. previewTemplate +=
  52. ' <div class="dz-upload bar" data-dz-uploadprogress><div class="progress"></div></div>\n ';
  53. previewTemplate += ' </div>\n ';
  54. previewTemplate += ' <div class="dz-success-mark">';
  55. previewTemplate += ' <span>上传成功</span>';
  56. previewTemplate += ' </div>\n ';
  57. previewTemplate += ' <div class="dz-error-mark">';
  58. previewTemplate += ' <span>上传失败</span>';
  59. previewTemplate += ' </div>\n ';
  60. previewTemplate += ' <div class="dz-error-message">';
  61. previewTemplate += ' <span data-dz-errormessage></span>';
  62. previewTemplate += ' </div>\n';
  63. previewTemplate += '</div>';
  64. const $dropzone = $('div#dataset');
  65. console.log('createDropzone');
  66. const dropzoneUploader = await createDropzone($dropzone[0], {
  67. url: '/todouploader',
  68. maxFiles: this.maxFiles,
  69. maxFilesize: this.maxFileSize,
  70. timeout: 0,
  71. autoQueue: false,
  72. dictDefaultMessage: this.dropzoneParams.data('default-message'),
  73. dictInvalidFileType: this.dropzoneParams.data('invalid-input-type'),
  74. dictFileTooBig: this.dropzoneParams.data('file-too-big'),
  75. dictRemoveFile: this.dropzoneParams.data('remove-file'),
  76. previewTemplate,
  77. });
  78. // 文件发送前调用
  79. dropzoneUploader.on('sending', (file, xhr, formData) => {
  80. console.log(xhr)
  81. console.log(formData)
  82. });
  83. // 文件复制后触发
  84. dropzoneUploader.on('addedfile', (file) => {
  85. console.log("file",file)
  86. if(file.status == 'added'){
  87. this.onFileAdded(file)
  88. }
  89. });
  90. dropzoneUploader.on('success', (file, res) => {
  91. this.emitDropzoneSuccess(file)
  92. });
  93. dropzoneUploader.on('totaluploadprogress', function(file, progress){
  94. this.updateProgress(file, progress)
  95. });
  96. dropzoneUploader.on('maxfilesexceeded', function (file) {
  97. if (this.files[0].status !== 'success') {
  98. alert(this.dropzoneParams.data('waitting-uploading'));
  99. this.removeFile(file);
  100. return;
  101. }
  102. this.removeAllFiles();
  103. this.addFile(file);
  104. });
  105. this.dropzoneUploader = dropzoneUploader;
  106. },
  107. methods: {
  108. resetStatus() {
  109. this.progress = 0;
  110. this.status = '';
  111. },
  112. updateProgress(file, progress) {
  113. file.previewTemplate.querySelector(
  114. '.dz-upload'
  115. ).style.width = `${progress}%`;
  116. },
  117. emitDropzoneSuccess(file) {
  118. file.status = 'success';
  119. this.dropzoneUploader.emit('success', file);
  120. this.dropzoneUploader.emit('complete', file);
  121. this.finishUpload(file)
  122. },
  123. emitDropzoneFailed(file) {
  124. this.status = this.dropzoneParams.data('falied');
  125. file.status = 'error';
  126. this.dropzoneUploader.emit('error', file);
  127. // this.dropzoneUploader.emit('complete', file);
  128. },
  129. onFileAdded(file) {
  130. // file.datasetId = document
  131. // .getElementById('datasetId')
  132. // .getAttribute('datasetId');
  133. console.log("执行到我了")
  134. this.resetStatus();
  135. this.status = this.dropzoneParams.data('obs-connectting');
  136. // 引入obs库
  137. var ObsClient = require('esdk-obs-nodejs');
  138. // 创建ObsClient实例
  139. var obsClient = new ObsClient({
  140. access_key_id: 'FDP3LRMHLB9S77VWEHE3',
  141. secret_access_key: 'LyM82Wk80pgjhs2z7AdDcsdpCWhbsJtSzQ7hkESN',
  142. server : 'https://112.95.163.82'
  143. });
  144. console.log("obsClient", obsClient)
  145. // 创建桶
  146. // obsClient.createBucket({
  147. // Bucket : 'bucketname'
  148. // }, (err, result) => {
  149. // if(err){
  150. // console.error('Error-->' + err);
  151. // this.emitDropzoneFailed(file)
  152. // }else{
  153. // console.log('Status-->' + result.CommonMsg.Status);
  154. // }
  155. // });
  156. obsClient.uploadFile({
  157. Bucket : 'bucketname',
  158. Key : this.get_result().key,
  159. // 设置待上传的本地文件,localfile为待上传的本地文件路径,需要指定到具体的文件名
  160. UploadFile : file.name,
  161. // 设置分段大小为10MB
  162. PartSize : 10 * 1024 * 1024,
  163. // 开启断点续传模式
  164. EnableCheckpoint : true
  165. }, (err, result) => {
  166. if(err){
  167. console.error('Error-->' + err);
  168. this.emitDropzoneFailed(file)
  169. }else{
  170. console.log('RequestId-->' + result.InterfaceResult.RequestId);
  171. console.log('Bucket-->' + result.InterfaceResult.Bucket);
  172. console.log('Key-->' + result.InterfaceResult.Key);
  173. console.log('Location-->' + result.InterfaceResult.Location);
  174. this.emitDropzoneSuccess(file);
  175. }
  176. });
  177. },
  178. get_result(){
  179. var res
  180. $.ajax({
  181. url: '/attachments/get_obs_key',
  182. type: 'GET',
  183. async: false,
  184. success: function(result){
  185. res = result
  186. }
  187. });
  188. console.log("res=", res)
  189. return res
  190. },
  191. finishUpload(file) {
  192. $.ajax({
  193. url: '/attachments/add',
  194. type: 'POST',
  195. data: {
  196. 'uuid': get_result().uuid,
  197. 'file_name': filepath.split('/')[-1],
  198. 'size': file.size,
  199. 'dataset_id': file.datasetId,
  200. '_csrf': csrf,
  201. 'type': 1
  202. },
  203. async: false,
  204. success: function (data) {
  205. console.log(data)
  206. }
  207. })
  208. setTimeout(() => {
  209. window.location.reload();
  210. }, 1000);
  211. }
  212. }
  213. };
  214. </script>
  215. <style>
  216. .dropzone-wrapper {
  217. margin: 2em auto;
  218. }
  219. .ui .dropzone {
  220. border: 2px dashed #0087f5;
  221. box-shadow: none !important;
  222. padding: 0;
  223. min-height: 5rem;
  224. border-radius: 4px;
  225. }
  226. .dataset .dataset-files #dataset .dz-preview.dz-file-preview,
  227. .dataset .dataset-files #dataset .dz-preview.dz-processing {
  228. display: flex;
  229. align-items: center;
  230. }
  231. .dataset .dataset-files #dataset .dz-preview {
  232. border-bottom: 1px solid #dadce0;
  233. min-height: 0;
  234. }
  235. </style>