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 9.5 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
4 years ago
4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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 createDropzone from '../features/dropzone.js';
  18. import ObsClient from 'esdk-obs-browserjs';
  19. const {_AppSubUrl, _StaticUrlPrefix, csrf} = window.config;
  20. export default {
  21. data() {
  22. return {
  23. dropzoneUploader: null,
  24. maxFiles: 1,
  25. maxFilesize: 1 * 1024 * 1024 * 1024 * 1024,
  26. acceptedFiles: '*/*',
  27. progress: 0,
  28. status: '',
  29. dropzoneParams: {},
  30. file_status_text: ''
  31. };
  32. },
  33. async mounted() {
  34. this.dropzoneParams = $('div#minioUploader-params');
  35. this.file_status_text = this.dropzoneParams.data('file-status');
  36. this.status = this.dropzoneParams.data('file-init-status');
  37. let previewTemplate = '';
  38. previewTemplate += '<div class="dz-preview dz-file-preview">\n ';
  39. previewTemplate += ' <div class="dz-details">\n ';
  40. previewTemplate += ' <div class="dz-filename">';
  41. previewTemplate +=
  42. ' <span data-dz-name data-dz-thumbnail></span>';
  43. previewTemplate += ' </div>\n ';
  44. previewTemplate += ' <div class="dz-size" data-dz-size></div>\n ';
  45. previewTemplate += ' </div>\n ';
  46. previewTemplate += ' <div class="dz-progress ui active progress">';
  47. previewTemplate +=
  48. ' <div class="dz-upload bar" data-dz-uploadprogress><div class="progress"></div></div>\n ';
  49. previewTemplate += ' </div>\n ';
  50. previewTemplate += ' <div class="dz-success-mark">';
  51. previewTemplate += ' <span>上传成功</span>';
  52. previewTemplate += ' </div>\n ';
  53. previewTemplate += ' <div class="dz-error-mark">';
  54. previewTemplate += ' <span>上传失败</span>';
  55. previewTemplate += ' </div>\n ';
  56. previewTemplate += ' <div class="dz-error-message">';
  57. previewTemplate += ' <span data-dz-errormessage></span>';
  58. previewTemplate += ' </div>\n';
  59. previewTemplate += '</div>';
  60. const $dropzone = $('div#dataset');
  61. console.log('createDropzone');
  62. const dropzoneUploader = await createDropzone($dropzone[0], {
  63. url: '/todouploader',
  64. maxFiles: this.maxFiles,
  65. maxFilesize: this.maxFileSize,
  66. timeout: 0,
  67. autoQueue: false,
  68. dictDefaultMessage: this.dropzoneParams.data('default-message'),
  69. dictInvalidFileType: this.dropzoneParams.data('invalid-input-type'),
  70. dictFileTooBig: this.dropzoneParams.data('file-too-big'),
  71. dictRemoveFile: this.dropzoneParams.data('remove-file'),
  72. previewTemplate,
  73. });
  74. // 将文件加入文件列表
  75. dropzoneUploader.on('addedfile', (file) => {
  76. if(file.status == 'added'){
  77. this.onFileAdded(file)
  78. }
  79. });
  80. dropzoneUploader.on('success', (file, res) => {
  81. this.emitDropzoneSuccess(file)
  82. });
  83. dropzoneUploader.on('totaluploadprogress', function(file, progress){
  84. this.updateProgress(file, progress)
  85. });
  86. dropzoneUploader.on('maxfilesexceeded', function (file) {
  87. if (this.files[0].status !== 'success') {
  88. alert(this.dropzoneParams.data('waitting-uploading'));
  89. this.removeFile(file);
  90. return;
  91. }
  92. this.removeAllFiles();
  93. this.addFile(file);
  94. });
  95. this.dropzoneUploader = dropzoneUploader;
  96. },
  97. methods: {
  98. resetStatus() {
  99. this.progress = 0;
  100. this.status = '';
  101. },
  102. updateProgress(file, progress) {
  103. file.previewTemplate.querySelector(
  104. '.dz-upload'
  105. ).style.width = `${progress}%`;
  106. },
  107. emitDropzoneSuccess(file) {
  108. file.status = 'success';
  109. this.dropzoneUploader.emit('success', file);
  110. this.dropzoneUploader.emit('complete', file);
  111. // this.finishUpload(file)
  112. },
  113. emitDropzoneFailed(file) {
  114. this.status = this.dropzoneParams.data('falied');
  115. file.status = 'error';
  116. this.dropzoneUploader.emit('error', file);
  117. // this.dropzoneUploader.emit('complete', file);
  118. },
  119. onFileAdded(file) {
  120. this.resetStatus();
  121. this.status = this.dropzoneParams.data('obs-connecting');
  122. this.do_multi_uploader(file)
  123. },
  124. // 获取key
  125. get_result(){
  126. var res
  127. $.ajax({
  128. url: '/attachments/get_obs_key',
  129. type: 'GET',
  130. async: false,
  131. success: function(result){
  132. res = result
  133. }
  134. });
  135. return res
  136. },
  137. // 构建ObsClient
  138. getObsClient(){
  139. return new ObsClient({
  140. access_key_id: 'FDP3LRMHLB9S77VWEHE3',
  141. secret_access_key: 'LyM82Wk80pgjhs2z7AdDcsdpCWhbsJtSzQ7hkESN',
  142. server : 'https://obs.cn-south-222.ai.pcl.cn'
  143. });
  144. },
  145. // 断点续传
  146. do_multi_uploader(file){
  147. console.log("file = ", file)
  148. const result = this.get_result()
  149. const _this = this
  150. const upload_datasetId = document
  151. .getElementById('datasetId')
  152. .getAttribute('datasetId');
  153. const obsClient = this.getObsClient()
  154. var cp;
  155. var hook;
  156. obsClient.uploadFile({
  157. Bucket : 'testopendata',
  158. Key : result.key,
  159. SourceFile : file,
  160. PartSize : 64 * 1024 * 1024,
  161. // 更新进度条
  162. ProgressCallback : function(transferredAmount, totalAmount, totalSeconds){
  163. _this.updateProgress(file, ((transferredAmount / totalAmount) * 100).toFixed(2))
  164. _this.status = `${_this.dropzoneParams.data('uploading')} ${(
  165. (transferredAmount / totalAmount) *
  166. 100
  167. ).toFixed(2)}%`;
  168. },
  169. // 监听文件上传结果
  170. EventCallback : function(eventType, eventParam, eventResult){
  171. // 文件上传成功
  172. if(eventType == 'completeMultipartUploadSucceed'){
  173. $.ajax({
  174. url: '/attachments/add',
  175. type: 'POST',
  176. data: {
  177. 'uuid': result.uuid,
  178. 'file_name': file.name,
  179. 'size': file.size,
  180. 'dataset_id': upload_datasetId,
  181. '_csrf': csrf,
  182. 'type': 1
  183. },
  184. async: false,
  185. success: function (data) {
  186. _this.progress = 100;
  187. _this.status = this.dropzoneParams.data('upload-complete');
  188. _this.emitDropzoneSuccess(file)
  189. },
  190. error: function(){
  191. console.log("发送/attachments/add的post错误1")
  192. _this.emitDropzoneFailed(file)
  193. }
  194. });
  195. }
  196. },
  197. ResumeCallback : function(resumeHook, uploadCheckpoint){
  198. hook = resumeHook;
  199. cp = uploadCheckpoint;
  200. }
  201. }, function(err, result){
  202. // 出现错误,再次调用断点续传接口,继续上传任务
  203. if(err){
  204. obsClient.uploadFile({
  205. UploadCheckpoint : cp,
  206. // 断点续传后继续更新进度条
  207. ProgressCallback : function(transferredAmount, totalAmount, totalSeconds){
  208. _this.updateProgress(file, ((transferredAmount / totalAmount) * 100).toFixed(2))
  209. _this.status = `${_this.dropzoneParams.data('uploading')} ${(
  210. (transferredAmount / totalAmount) *
  211. 100
  212. ).toFixed(2)}%`;
  213. },
  214. // 监听断点续传的结果
  215. EventCallback : function(eventType, eventParam, eventResult){
  216. // 文件断点续传成功
  217. if(eventType == 'completeMultipartUploadSucceed'){
  218. $.ajax({
  219. url: '/attachments/add',
  220. type: 'POST',
  221. data: {
  222. 'uuid': result.uuid,
  223. 'file_name': file.name,
  224. 'size': file.size,
  225. 'dataset_id': upload_datasetId,
  226. '_csrf': csrf,
  227. 'type': 1
  228. },
  229. async: false,
  230. success: function (data) {
  231. _this.progress = 100;
  232. _this.status = this.dropzoneParams.data('upload-complete');
  233. _this.emitDropzoneSuccess(file)
  234. },
  235. error: function(){
  236. _this.emitDropzoneFailed(file)
  237. console.log("发送/attachments/add的post错误2")
  238. }
  239. });
  240. }else if (eventType == 'uploadPartFailed'){
  241. _this.emitDropzoneFailed(file)
  242. console.log("经过断点上传之后还是不能上传成功,该分段上传失败")
  243. }
  244. }
  245. });
  246. }
  247. });
  248. },
  249. }
  250. };
  251. </script>
  252. <style>
  253. .dropzone-wrapper {
  254. margin: 2em auto;
  255. }
  256. .ui .dropzone {
  257. border: 2px dashed #0087f5;
  258. box-shadow: none !important;
  259. padding: 0;
  260. min-height: 5rem;
  261. border-radius: 4px;
  262. }
  263. .dataset .dataset-files #dataset .dz-preview.dz-file-preview,
  264. .dataset .dataset-files #dataset .dz-preview.dz-processing {
  265. display: flex;
  266. align-items: center;
  267. }
  268. .dataset .dataset-files #dataset .dz-preview {
  269. border-bottom: 1px solid #dadce0;
  270. min-height: 0;
  271. }
  272. </style>