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.1 kB

5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 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
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  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. import * as ObsClient from '../features/esdk-obs-browserjs-3.19.5.min.js';
  24. const {_AppSubUrl, _StaticUrlPrefix, csrf} = window.config;
  25. export default {
  26. data() {
  27. return {
  28. dropzoneUploader: null,
  29. maxFiles: 1,
  30. maxFilesize: 1 * 1024 * 1024 * 1024 * 1024,
  31. acceptedFiles: '*/*',
  32. progress: 0,
  33. status: '',
  34. dropzoneParams: {},
  35. file_status_text: ''
  36. };
  37. },
  38. async mounted() {
  39. this.dropzoneParams = $('div#minioUploader-params');
  40. this.file_status_text = this.dropzoneParams.data('file-status');
  41. this.status = this.dropzoneParams.data('file-init-status');
  42. let previewTemplate = '';
  43. previewTemplate += '<div class="dz-preview dz-file-preview">\n ';
  44. previewTemplate += ' <div class="dz-details">\n ';
  45. previewTemplate += ' <div class="dz-filename">';
  46. previewTemplate +=
  47. ' <span data-dz-name data-dz-thumbnail></span>';
  48. previewTemplate += ' </div>\n ';
  49. previewTemplate += ' <div class="dz-size" data-dz-size></div>\n ';
  50. previewTemplate += ' </div>\n ';
  51. previewTemplate += ' <div class="dz-progress ui active progress">';
  52. previewTemplate +=
  53. ' <div class="dz-upload bar" data-dz-uploadprogress><div class="progress"></div></div>\n ';
  54. previewTemplate += ' </div>\n ';
  55. previewTemplate += ' <div class="dz-success-mark">';
  56. previewTemplate += ' <span>上传成功</span>';
  57. previewTemplate += ' </div>\n ';
  58. previewTemplate += ' <div class="dz-error-mark">';
  59. previewTemplate += ' <span>上传失败</span>';
  60. previewTemplate += ' </div>\n ';
  61. previewTemplate += ' <div class="dz-error-message">';
  62. previewTemplate += ' <span data-dz-errormessage></span>';
  63. previewTemplate += ' </div>\n';
  64. previewTemplate += '</div>';
  65. const $dropzone = $('div#dataset');
  66. console.log('createDropzone');
  67. const dropzoneUploader = await createDropzone($dropzone[0], {
  68. url: '/todouploader',
  69. maxFiles: this.maxFiles,
  70. maxFilesize: this.maxFileSize,
  71. timeout: 0,
  72. autoQueue: false,
  73. dictDefaultMessage: this.dropzoneParams.data('default-message'),
  74. dictInvalidFileType: this.dropzoneParams.data('invalid-input-type'),
  75. dictFileTooBig: this.dropzoneParams.data('file-too-big'),
  76. dictRemoveFile: this.dropzoneParams.data('remove-file'),
  77. previewTemplate,
  78. });
  79. // 文件发送前调用
  80. // dropzoneUploader.on('sending', (file, xhr, formData) => {
  81. // console.log(xhr)
  82. // console.log(formData)
  83. // });
  84. // 文件复制后触发
  85. dropzoneUploader.on('addedfile', (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. var file = document.getElementsByClassName('dropzone').files[0]
  136. console.log("file", file)
  137. // 创建ObsClient实例
  138. var obsClient = new ObsClient({
  139. access_key_id: 'FDP3LRMHLB9S77VWEHE3',
  140. secret_access_key: 'LyM82Wk80pgjhs2z7AdDcsdpCWhbsJtSzQ7hkESN',
  141. server : 'https://112.95.163.82'
  142. });
  143. var cp;
  144. var hook;
  145. obsClient.uploadFile({
  146. Bucket : 'mybucket',
  147. Key : this.get_result().key,
  148. SourceFile : document.getElementsByClassName('dropzone').files[0],
  149. PartSize : 64 * 1024 * 1024,
  150. ProgressCallback : function(transferredAmount, totalAmount, totalSeconds){
  151. console.log(transferredAmount * 1.0 / totalSeconds / 1024);
  152. console.log(transferredAmount * 100.0 / totalAmount);
  153. if(hook && (transferredAmount / totalAmount) > 0.5){
  154. // 暂停断点续传任务
  155. hook.cancel();
  156. }
  157. },
  158. EventCallback : function(eventType, eventParam, eventResult){
  159. // 处理事件响应
  160. console.log("1", eventType)
  161. console.log("2",eventParam)
  162. console.log("3",eventResult)
  163. },
  164. ResumeCallback : function(resumeHook, uploadCheckpoint){
  165. // 获取取消断点续传上传任务控制参数
  166. hook = resumeHook;
  167. // 记录断点
  168. cp = uploadCheckpoint;
  169. }
  170. }, function(err, result){
  171. console.error('Error-->' + err);
  172. // 出现错误,再次调用断点续传接口,继续上传任务
  173. if(err){
  174. obsClient.uploadFile({
  175. UploadCheckpoint : cp,
  176. ProgressCallback : function(transferredAmount, totalAmount, totalSeconds){
  177. console.log(transferredAmount * 1.0 / totalSeconds / 1024);
  178. console.log(transferredAmount * 100.0 / totalAmount);
  179. },
  180. EventCallback : function(eventType, eventParam, eventResult){
  181. // 处理事件响应
  182. console.log(eventType)
  183. console.log(eventParam)
  184. console.log(eventResult)
  185. },
  186. }, function(err, result){
  187. if(err){
  188. console.error('Error-->' + err);
  189. }else{
  190. if(result.CommonMsg.Status < 300){
  191. console.log('RequestId-->' + result.InterfaceResult.RequestId);
  192. console.log('Bucket-->' + result.InterfaceResult.Bucket);
  193. console.log('Key-->' + result.InterfaceResult.Key);
  194. console.log('Location-->' + result.InterfaceResult.Location);
  195. }else{
  196. console.log('Code-->' + result.CommonMsg.Code);
  197. console.log('Message-->' + result.CommonMsg.Message);
  198. }
  199. }
  200. });
  201. }else {
  202. console.log('Status-->' + result.CommonMsg.Status);
  203. if (result.CommonMsg.Status < 300 && result.InterfaceResult) {
  204. console.log('RequestId-->' + result.InterfaceResult.RequestId);
  205. }
  206. }
  207. });
  208. },
  209. get_result(){
  210. var res
  211. $.ajax({
  212. url: '/attachments/get_obs_key',
  213. type: 'GET',
  214. async: false,
  215. success: function(result){
  216. res = result
  217. }
  218. });
  219. console.log("res=", res)
  220. return res
  221. },
  222. finishUpload(file) {
  223. $.ajax({
  224. url: '/attachments/add',
  225. type: 'POST',
  226. data: {
  227. 'uuid': get_result().uuid,
  228. 'file_name': filepath.split('/')[-1],
  229. 'size': file.size,
  230. 'dataset_id': file.datasetId,
  231. '_csrf': csrf,
  232. 'type': 1
  233. },
  234. async: false,
  235. success: function (data) {
  236. console.log(data)
  237. }
  238. })
  239. setTimeout(() => {
  240. window.location.reload();
  241. }, 1000);
  242. }
  243. }
  244. };
  245. </script>
  246. <style>
  247. .dropzone-wrapper {
  248. margin: 2em auto;
  249. }
  250. .ui .dropzone {
  251. border: 2px dashed #0087f5;
  252. box-shadow: none !important;
  253. padding: 0;
  254. min-height: 5rem;
  255. border-radius: 4px;
  256. }
  257. .dataset .dataset-files #dataset .dz-preview.dz-file-preview,
  258. .dataset .dataset-files #dataset .dz-preview.dz-processing {
  259. display: flex;
  260. align-items: center;
  261. }
  262. .dataset .dataset-files #dataset .dz-preview {
  263. border-bottom: 1px solid #dadce0;
  264. min-height: 0;
  265. }
  266. </style>