fmode-ng 0.0.113 → 0.0.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/README.md +37 -37
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
- package/esm2022/lib/aigc/agent/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
- package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
- package/esm2022/lib/aigc/index.mjs +10 -14
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
- package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
- package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
- package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
- package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
- package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
- package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
- package/esm2022/lib/aigc/story/index.mjs +10 -6
- package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
- package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
- package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
- package/esm2022/lib/aigc/story/story.service.mjs +10 -35
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
- package/esm2022/lib/aigc/voice/index.mjs +10 -7
- package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
- package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
- package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
- package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
- package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
- package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
- package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
- package/esm2022/lib/code/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
- package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
- package/esm2022/lib/core/agent/chat/index.mjs +10 -4
- package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
- package/esm2022/lib/core/agent/index.mjs +10 -6
- package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
- package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
- package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
- package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
- package/esm2022/lib/core/agent/story/index.mjs +10 -2
- package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
- package/esm2022/lib/core/agent/task/index.mjs +10 -2
- package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
- package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
- package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
- package/esm2022/lib/core/index.mjs +10 -4
- package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
- package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
- package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
- package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
- package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
- package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
- package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
- package/esm2022/lib/core/parse/index.mjs +10 -5
- package/esm2022/lib/core/parse/types.mjs +10 -2
- package/esm2022/lib/core/voice/index.mjs +10 -3
- package/esm2022/lib/core/voice/tts/index.mjs +10 -2
- package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
- package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
- package/esm2022/lib/icon/filetype/index.mjs +10 -12
- package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
- package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
- package/esm2022/lib/icon/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
- package/esm2022/lib/nova-cloud/index.mjs +10 -3
- package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
- package/esm2022/lib/payment/index.mjs +10 -2
- package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
- package/esm2022/lib/payment/payment.service.mjs +10 -202
- package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
- package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
- package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
- package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
- package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
- package/esm2022/lib/person/index.mjs +10 -5
- package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
- package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
- package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
- package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
- package/esm2022/lib/person/person.service.mjs +8 -193
- package/esm2022/lib/platform/cross.service.mjs +10 -62
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
- package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
- package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
- package/esm2022/lib/storage/storage.module.mjs +10 -42
- package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
- package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
- package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
- package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
- package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
- package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
- package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
- package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
- package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
- package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
- package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
- package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
- package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
- package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
- package/esm2022/lib/text/index.mjs +10 -4
- package/esm2022/lib/user/account/account.service.mjs +10 -222
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -433
- package/esm2022/lib/user/login/login.component.mjs +10 -916
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
- package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
- package/esm2022/lib/user/profile/profile.module.mjs +10 -54
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -102
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -21
- package/fesm2022/fmode-ng.mjs +7 -19788
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
- package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
- package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
- package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
- package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
- package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
- package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
- package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
- package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
- package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
- package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
- package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
- package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
- package/lib/aigc/story/story.service.d.ts +3 -2
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
- package/lib/core/agent/story/agent.story.d.ts +8 -8
- package/lib/core/parse/datatype/geopoint.d.ts +5 -1
- package/lib/core/parse/fmode.cloud.d.ts +32 -0
- package/lib/core/parse/fmode.object.d.ts +2 -2
- package/lib/core/parse/fmode.parse.d.ts +15 -9
- package/lib/core/parse/fmode.query.d.ts +41 -2
- package/lib/core/parse/fmode.user.d.ts +1 -0
- package/lib/core/parse/index.d.ts +1 -0
- package/lib/core/parse/types.d.ts +2 -0
- package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
- package/lib/payment/payment/payment.component.d.ts +3 -3
- package/lib/payment/payment.service.d.ts +4 -4
- package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
- package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
- package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
- package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
- package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
- package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
- package/lib/person/person-detail/person-detail.component.d.ts +4 -4
- package/lib/person/person.service.d.ts +7 -7
- package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
- package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
- package/lib/text/fm-article-editor/article.service.d.ts +12 -12
- package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
- package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
- package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
- package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
- package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
- package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
- package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
- package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
- package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
- package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
- package/lib/user/account/account.service.d.ts +2 -2
- package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +5 -5
- package/lib/user/login/login.component.d.ts +3 -3
- package/lib/user/profile/auth-profile.service.d.ts +8 -8
- package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
- package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
- package/lib/user/staff/staff.service.d.ts +3 -3
- package/lib/user/user-name.pipe.d.ts +2 -2
- package/package.json +12 -18
|
@@ -1,515 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Platform } from '@ionic/angular';
|
|
4
|
-
import { Camera, CameraResultType, CameraSource } from "@capacitor/camera";
|
|
5
|
-
import { Capacitor } from "@capacitor/core";
|
|
6
|
-
import { Filesystem } from "@capacitor/filesystem";
|
|
7
|
-
import { FilesystemWeb } from '@capacitor/filesystem/dist/esm/web.js';
|
|
8
|
-
import * as qiniu from "qiniu-js";
|
|
9
|
-
import Parse from "parse";
|
|
10
|
-
import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
|
|
11
|
-
// import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
|
|
12
|
-
import CryptoJS from "crypto-js";
|
|
13
|
-
/**
|
|
14
|
-
* MediaCapture插件
|
|
15
|
-
* @private
|
|
16
|
-
* @description
|
|
17
|
-
* 依赖:File
|
|
18
|
-
* npm i -S cordova-plugin-file @awesome-cordova-plugins/file
|
|
19
|
-
*/
|
|
20
|
-
import { MediaCapture } from "@awesome-cordova-plugins/media-capture/ngx";
|
|
21
|
-
import { calcFileMd5 } from './util-file-md5';
|
|
22
|
-
import { getFileMetadata } from './util-file-metadata';
|
|
23
|
-
import * as i0 from "@angular/core";
|
|
24
|
-
import * as i1 from "@ionic/angular";
|
|
25
|
-
import * as i2 from "@awesome-cordova-plugins/diagnostic/ngx";
|
|
26
|
-
/**
|
|
27
|
-
* NovaUploadService 上传服务
|
|
28
|
-
* @public
|
|
29
|
-
*/
|
|
30
|
-
export class NovaUploadService {
|
|
31
|
-
constructor(platform, diagnostic) {
|
|
32
|
-
this.platform = platform;
|
|
33
|
-
this.diagnostic = diagnostic;
|
|
34
|
-
this.maxSize = 5 * 1024 * 1024;
|
|
35
|
-
this.getUptoken(true);
|
|
36
|
-
this.requestPermission();
|
|
37
|
-
this.queryDomain();
|
|
38
|
-
}
|
|
1
|
+
|
|
39
2
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* progressData {
|
|
45
|
-
"total": {
|
|
46
|
-
"size": 8491,
|
|
47
|
-
"loaded": 8490,
|
|
48
|
-
"percent": 99.98822282416675
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
* novafileData {
|
|
52
|
-
"id":"xxxxxxxxxx" // Attachment.objectId
|
|
53
|
-
"hash": "FoYHjpyTif1t8uOMv6N6sVIeGTvq",
|
|
54
|
-
"key": "E4KpGvTEto/20230901/053605467.jpg",
|
|
55
|
-
"url": "https://file-cloud.fmode.cn/E4KpGvTEto/20230901/053605467.jpg",
|
|
56
|
-
"name": "20230901173605.jpg",
|
|
57
|
-
"type": "image/jpg",
|
|
58
|
-
"size": 7853
|
|
59
|
-
}
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/service-upload/nova-upload.service.mjs
|
|
60
7
|
*/
|
|
61
|
-
async upload(file,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
let nameList = file.name?.split(".");
|
|
65
|
-
let format = nameList[nameList.length - 1]; // 文件后缀
|
|
66
|
-
// 计算文件md5
|
|
67
|
-
let uploadFile = { id: "", name: "", type: "", size: 0, key: "", url: "" };
|
|
68
|
-
let fileMd5 = await this.getFileMd5(file);
|
|
69
|
-
let attach = await this.getAttachByMd5(fileMd5);
|
|
70
|
-
if (attach?.id) { // 若存在,直接补全
|
|
71
|
-
uploadFile.url = attach?.get("url");
|
|
72
|
-
uploadFile.name = attach?.get("name");
|
|
73
|
-
uploadFile.type = attach?.get("mime");
|
|
74
|
-
uploadFile.size = attach?.get("size");
|
|
75
|
-
uploadFile.metadata = attach?.get("metadata");
|
|
76
|
-
onProgress && onProgress({ "total": { "loaded": uploadFile.size, "size": uploadFile.size, "percent": 100 } });
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
// 转换文件blob
|
|
80
|
-
let blob = this.fileToBlob(file);
|
|
81
|
-
// 图片上传
|
|
82
|
-
if (type.indexOf('image') > -1) {
|
|
83
|
-
uploadFile = await this.saveQiniuImageFile(blob, format, null, onProgress);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
uploadFile = await this.saveQiniuMediaFile(file, blob, null, onProgress);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// 纠正file.url
|
|
90
|
-
if (uploadFile?.url?.indexOf('undefined') > -1) {
|
|
91
|
-
uploadFile.url = (this.qiniuDomain || "https://file-cloud.fmode.cn/") + uploadFile.url.replace("undefined/", "");
|
|
92
|
-
}
|
|
93
|
-
// 补充metadata
|
|
94
|
-
let baseInfo = await getFileMetadata(file);
|
|
95
|
-
let metadata = baseInfo.metadata;
|
|
96
|
-
if (!uploadFile.metadata)
|
|
97
|
-
uploadFile.metadata = {};
|
|
98
|
-
Object.keys(metadata).forEach(key => {
|
|
99
|
-
uploadFile.metadata[key] = metadata[key];
|
|
100
|
-
});
|
|
101
|
-
console.log("metadata", metadata, uploadFile);
|
|
102
|
-
// 保存附件
|
|
103
|
-
let attachment;
|
|
104
|
-
if (uploadFile?.url) {
|
|
105
|
-
attachment = await this.saveAttachment(uploadFile, this.qiniuDomain, null, this.getCompanyId(), file);
|
|
106
|
-
}
|
|
107
|
-
if (attachment?.id) {
|
|
108
|
-
uploadFile.id = attachment?.id;
|
|
109
|
-
}
|
|
110
|
-
uploadFile.attachment = attachment;
|
|
111
|
-
return uploadFile;
|
|
112
|
-
}
|
|
113
|
-
async getAttachByMd5(fileMd5) {
|
|
114
|
-
if (!fileMd5)
|
|
115
|
-
return null;
|
|
116
|
-
let query = new Parse.Query("Attachment");
|
|
117
|
-
query.equalTo("md5", fileMd5);
|
|
118
|
-
query.addDescending("createdAt");
|
|
119
|
-
let attach = await query.first();
|
|
120
|
-
return attach;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* 移动端上传专用方法
|
|
124
|
-
* @returns
|
|
125
|
-
*/
|
|
126
|
-
isCapacitor() {
|
|
127
|
-
return this.platform.is("capacitor") || this.platform.is("cordova");
|
|
128
|
-
}
|
|
129
|
-
async getFileMd5(file) {
|
|
130
|
-
let md5File;
|
|
131
|
-
try {
|
|
132
|
-
md5File = await calcFileMd5(file);
|
|
133
|
-
console.log("md5File", md5File);
|
|
134
|
-
}
|
|
135
|
-
catch (errmd5) {
|
|
136
|
-
console.error(errmd5);
|
|
137
|
-
}
|
|
138
|
-
return md5File;
|
|
139
|
-
}
|
|
140
|
-
async requestPermission() {
|
|
141
|
-
if (!this.isCapacitor())
|
|
142
|
-
return;
|
|
143
|
-
await this.requestStoagePermission();
|
|
144
|
-
await this.requestCameraPermission();
|
|
145
|
-
}
|
|
146
|
-
async requestStoagePermission() {
|
|
147
|
-
let isAvailable = await this.diagnostic.isExternalStorageAuthorized();
|
|
148
|
-
console.log("permisson_STORAGE:", isAvailable);
|
|
149
|
-
if (!isAvailable) {
|
|
150
|
-
let data = await this.diagnostic.requestExternalStorageAuthorization();
|
|
151
|
-
}
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
async requestCameraPermission() {
|
|
155
|
-
let isAvailable = await this.diagnostic.isCameraAuthorized();
|
|
156
|
-
console.log("permisson_Camera:", isAvailable);
|
|
157
|
-
if (!isAvailable) {
|
|
158
|
-
let data = await this.diagnostic.requestCameraAuthorization();
|
|
159
|
-
}
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* 上传Token获取方法
|
|
164
|
-
* @returns
|
|
165
|
-
*/
|
|
166
|
-
async getUptoken(refresh = false) {
|
|
167
|
-
console.log("getUptoken");
|
|
168
|
-
if (!this.qiniuConf && !refresh)
|
|
169
|
-
return;
|
|
170
|
-
try {
|
|
171
|
-
console.log(this.getCompanyId());
|
|
172
|
-
let data = await Parse.Cloud.run("qiniu_uptoken", {
|
|
173
|
-
company: this.getCompanyId(),
|
|
174
|
-
});
|
|
175
|
-
console.log(data);
|
|
176
|
-
this.qiniuConf = data;
|
|
177
|
-
}
|
|
178
|
-
catch (err) {
|
|
179
|
-
console.error(err);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* 生成文件上传Key值:<公司id>/<yyyymmdd>/<file.id><hhMMss>.<ext>
|
|
184
|
-
* @desc 用于对象存储含全路径的文件名称
|
|
185
|
-
*/
|
|
186
|
-
genFileKey(file, company) {
|
|
187
|
-
let today = new Date();
|
|
188
|
-
let dp = new DatePipe("en");
|
|
189
|
-
if (!company) {
|
|
190
|
-
company = this.getCompanyId();
|
|
191
|
-
}
|
|
192
|
-
let comPrefix = "storage/company/" + company + "/";
|
|
193
|
-
let storePrefix = "";
|
|
194
|
-
if (this.store?.id) {
|
|
195
|
-
"store/" + this.store?.id + "/";
|
|
196
|
-
}
|
|
197
|
-
let fileUniKey = dp.transform(today, "yMMdd") + "/" + String(file.id).substr(20, 6) + dp.transform(today, "hhmmssSSS") + /\.[^\.]+/.exec(file.name);
|
|
198
|
-
return comPrefix + storePrefix + fileUniKey;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* 获取当前登录用户公司ID
|
|
202
|
-
* @returns 公司ID
|
|
203
|
-
*/
|
|
204
|
-
getCompanyId() {
|
|
205
|
-
// 获取公司ID,或无指定值,则获取localStorage中company
|
|
206
|
-
if (this.company) {
|
|
207
|
-
return this.company;
|
|
208
|
-
}
|
|
209
|
-
let id = localStorage.getItem("company");
|
|
210
|
-
return id;
|
|
211
|
-
}
|
|
212
|
-
async queryDomain() {
|
|
213
|
-
let Company = new Parse.Query('Company');
|
|
214
|
-
let company = await Company.get(this.getCompanyId());
|
|
215
|
-
if (company.get("configQiniu") && company.get("configQiniu").domain) {
|
|
216
|
-
console.log(company.get("configQiniu").domain);
|
|
217
|
-
this.qiniuDomain = company.get("configQiniu").domain;
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
this.qiniuDomain = 'https://file-cloud.fmode.cn';
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* 保存上传信息至附件表 Attachment
|
|
225
|
-
* @param file 附件信息
|
|
226
|
-
* @returns attachment Parse.Object
|
|
227
|
-
*/
|
|
228
|
-
async saveAttachment(file, domain, cateId, company, fileSrc) {
|
|
229
|
-
file.md5 = await this.getFileMd5(fileSrc);
|
|
230
|
-
let url = file.url;
|
|
231
|
-
if (url.startsWith("http")) {
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
url = domain + url;
|
|
235
|
-
}
|
|
236
|
-
url = url.replace(/undefined\//, "");
|
|
237
|
-
// 帐套参数默认加载本地存储
|
|
238
|
-
if (!company) {
|
|
239
|
-
company = localStorage.getItem("company");
|
|
240
|
-
}
|
|
241
|
-
let user = Parse.User.current();
|
|
242
|
-
let attachment;
|
|
243
|
-
if (attachment?.id) {
|
|
244
|
-
console.log("fast upload");
|
|
245
|
-
return attachment;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
let Attachment = Parse.Object.extend("Attachment");
|
|
249
|
-
attachment = new Attachment();
|
|
250
|
-
attachment.set("size", file.size);
|
|
251
|
-
attachment.set("url", url);
|
|
252
|
-
attachment.set("name", file.name);
|
|
253
|
-
attachment.set("mime", file.type);
|
|
254
|
-
attachment.set("md5", file?.md5);
|
|
255
|
-
attachment.set("metadata", file?.metadata);
|
|
256
|
-
if (this.store?.id) {
|
|
257
|
-
attachment.set("store", this.store.toPointer());
|
|
258
|
-
}
|
|
259
|
-
if (user?.id) {
|
|
260
|
-
attachment.set("user", user.toPointer());
|
|
261
|
-
}
|
|
262
|
-
if (company) {
|
|
263
|
-
attachment.set("company", {
|
|
264
|
-
__type: "Pointer",
|
|
265
|
-
className: "Company",
|
|
266
|
-
objectId: localStorage.getItem("company")
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
if (cateId) {
|
|
270
|
-
attachment.set("category", {
|
|
271
|
-
__type: "Pointer",
|
|
272
|
-
className: "Category",
|
|
273
|
-
objectId: cateId
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
return await attachment.save();
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* 录像并上传
|
|
281
|
-
*/
|
|
282
|
-
async captureVideo(conf) {
|
|
283
|
-
this.qiniuConf = conf;
|
|
284
|
-
if (!this.isCapacitor())
|
|
285
|
-
return;
|
|
286
|
-
// {"name":"VID_20230513_182235.mp4","localURL":"https://localhost/__cdvfile_sdcard__/DCIM/Camera/VID_20230513_182235.mp4","type":"video/mp4","lastModified":null,"lastModifiedDate":1683973355000,"size":6100161,"start":0,"end":0,"fullPath":"file:///storage/emulated/0/DCIM/Camera/VID_20230513_182235.mp4"}
|
|
287
|
-
let mediaFile = await this.cameraCaptureVideoFile();
|
|
288
|
-
// let mediaData:string = await this.getMediaFileDataString(mediaFile);
|
|
289
|
-
let fileBlob = await this.getMediaFileDataString(mediaFile);
|
|
290
|
-
// let fileBlob = await this.base64ToBlobType(mediaData,mediaFile.type);
|
|
291
|
-
let qiniuFile = await this.saveQiniuMediaFile(mediaFile, fileBlob);
|
|
292
|
-
return qiniuFile;
|
|
293
|
-
}
|
|
294
|
-
async cameraCaptureVideoFile() {
|
|
295
|
-
let options = {
|
|
296
|
-
limit: 1,
|
|
297
|
-
// quality:50
|
|
298
|
-
};
|
|
299
|
-
let mediaCapture = MediaCapture;
|
|
300
|
-
let list = await mediaCapture.captureVideo(options);
|
|
301
|
-
if (list?.length > 0) {
|
|
302
|
-
return list[0];
|
|
303
|
-
}
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
async getMediaFileDataString(mediafile) {
|
|
307
|
-
let filesystem = new FilesystemWeb();
|
|
308
|
-
let path = mediafile.fullPath.replaceAll("///", "//");
|
|
309
|
-
let stat = await Filesystem.stat({ path: mediafile.fullPath });
|
|
310
|
-
let webUri = Capacitor.convertFileSrc(stat.uri);
|
|
311
|
-
let content = await fetch(webUri);
|
|
312
|
-
let blob = await content.blob();
|
|
313
|
-
console.log(blob.size);
|
|
314
|
-
console.log(JSON.stringify(stat));
|
|
315
|
-
// CapacitorConver
|
|
316
|
-
// file:///storage/emulated/0/DCIM/Camera/VID_20230612_125907030.mp4
|
|
317
|
-
// let filesystem = Filesystem
|
|
318
|
-
// let content = await filesystem.readFile({
|
|
319
|
-
// path:mediafile.fullPath
|
|
320
|
-
// })
|
|
321
|
-
console.log(JSON.stringify(content));
|
|
322
|
-
console.log(JSON.stringify(Object.keys(content)));
|
|
323
|
-
// console.log(content?.data)
|
|
324
|
-
if (blob) {
|
|
325
|
-
return blob;
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
throw "读取文件失败";
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* 拍照并上传
|
|
333
|
-
* @returns -- {hash?:string,url:string,name:string,size:number,key:stirng}
|
|
334
|
-
*/
|
|
335
|
-
async takePicture(conf) {
|
|
336
|
-
this.qiniuConf = conf;
|
|
337
|
-
if (!this.isCapacitor())
|
|
338
|
-
return;
|
|
339
|
-
await this.getUptoken();
|
|
340
|
-
let image = await this.cameraTakePictureDataUrl();
|
|
341
|
-
// image.format
|
|
342
|
-
if (!image?.dataUrl)
|
|
343
|
-
return;
|
|
344
|
-
let blob = await this.base64ToBlob(image?.dataUrl);
|
|
345
|
-
let qiniuFile = await this.saveQiniuImageFile(blob, image?.format);
|
|
346
|
-
console.log(JSON.stringify(qiniuFile));
|
|
347
|
-
// this.saveAttachment()
|
|
348
|
-
return qiniuFile;
|
|
349
|
-
}
|
|
350
|
-
;
|
|
351
|
-
async cameraTakePictureDataUrl() {
|
|
352
|
-
if (!this.isCapacitor())
|
|
353
|
-
return;
|
|
354
|
-
const image = await Camera.getPhoto({
|
|
355
|
-
quality: 90,
|
|
356
|
-
allowEditing: false,
|
|
357
|
-
// saveToGallery:true,
|
|
358
|
-
source: CameraSource.Camera,
|
|
359
|
-
resultType: CameraResultType.DataUrl
|
|
360
|
-
});
|
|
361
|
-
return image;
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* 七牛上传函数:无需前端组件
|
|
365
|
-
* @param imageBlob: Blob
|
|
366
|
-
* @param format: string
|
|
367
|
-
*/
|
|
368
|
-
async saveQiniuImageFile(imageBlob, format, company, onProgress) {
|
|
369
|
-
// let that = this
|
|
370
|
-
let maxSize = this.maxSize;
|
|
371
|
-
if (imageBlob.size > maxSize) {
|
|
372
|
-
await console.log(`照片过大,超出限制5MB`);
|
|
373
|
-
throw "超出文件大小";
|
|
374
|
-
}
|
|
375
|
-
let dp = new DatePipe("en");
|
|
376
|
-
let id = dp.transform(new Date(), "yyyyMMddHHmmss");
|
|
377
|
-
let name = `${id}.${format}`;
|
|
378
|
-
let type = imageBlob.type;
|
|
379
|
-
// let file = new File([imageBlob], filename, { type: "image/jpeg" })
|
|
380
|
-
let putExtra = {
|
|
381
|
-
fname: name,
|
|
382
|
-
params: {},
|
|
383
|
-
// mimeType: "image/*",
|
|
384
|
-
mimeType: imageBlob.type
|
|
385
|
-
};
|
|
386
|
-
let config = {
|
|
387
|
-
useCdnDomain: true, //使用cdn加速
|
|
388
|
-
forceDirect: true // 强制不分片,放置上传报错
|
|
389
|
-
};
|
|
390
|
-
console.log(this.qiniuConf);
|
|
391
|
-
let qiniuFileKey = this.genFileKey({ id: id, name: name });
|
|
392
|
-
console.log("图片上传前");
|
|
393
|
-
console.log(qiniuFileKey, imageBlob, format);
|
|
394
|
-
return new Promise((resolve, reject) => {
|
|
395
|
-
console.log("进入了上传");
|
|
396
|
-
let observable = qiniu.upload(imageBlob, qiniuFileKey, this.qiniuConf?.uptoken, putExtra, config);
|
|
397
|
-
observable.subscribe({
|
|
398
|
-
next: (result_2) => {
|
|
399
|
-
// 主要用来展示进度
|
|
400
|
-
console.log(result_2);
|
|
401
|
-
onProgress && onProgress(result_2);
|
|
402
|
-
},
|
|
403
|
-
error: async (err_1) => {
|
|
404
|
-
// this.$notify('上传图片失败');
|
|
405
|
-
// await that.presentToast(`检测失败`, 1500, "danger")
|
|
406
|
-
console.log(err_1);
|
|
407
|
-
},
|
|
408
|
-
complete: (res_1) => {
|
|
409
|
-
console.log("上传完成");
|
|
410
|
-
console.log(`${this.qiniuConf?.domain}${res_1.key}`);
|
|
411
|
-
res_1.url = `${this.qiniuConf?.domain}${res_1.key}`;
|
|
412
|
-
res_1.name = name;
|
|
413
|
-
res_1.type = type;
|
|
414
|
-
res_1.size = imageBlob.size;
|
|
415
|
-
resolve(res_1);
|
|
416
|
-
},
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
async saveQiniuMediaFile(mediafile, fileBlob, company, onProgress) {
|
|
421
|
-
// let that = this
|
|
422
|
-
let name = mediafile.name;
|
|
423
|
-
let type = mediafile.type;
|
|
424
|
-
let size = mediafile.size;
|
|
425
|
-
let maxSize = this.maxSize || 100 * 1024 * 1024; // 限100M
|
|
426
|
-
if (size > maxSize) {
|
|
427
|
-
console.log(`视频过大,超出限制100MB`);
|
|
428
|
-
throw "超出文件大小";
|
|
429
|
-
}
|
|
430
|
-
let dp = new DatePipe("en");
|
|
431
|
-
let id = dp.transform(new Date(), "yyyyMMddHHmmss");
|
|
432
|
-
// let file = new File([mediaBlob], filename, { type: "image/jpeg" })
|
|
433
|
-
let putExtra = {
|
|
434
|
-
fname: name,
|
|
435
|
-
params: {},
|
|
436
|
-
mimeType: type,
|
|
437
|
-
};
|
|
438
|
-
let config = {
|
|
439
|
-
useCdnDomain: true, //使用cdn加速
|
|
440
|
-
forceDirect: true // 强制不分片,放置上传报错
|
|
441
|
-
};
|
|
442
|
-
let qiniuFileKey = this.genFileKey({ id: id, name: name });
|
|
443
|
-
console.log("图片上传前");
|
|
444
|
-
console.log(mediafile.name, fileBlob.size);
|
|
445
|
-
console.log(fileBlob.size);
|
|
446
|
-
console.log(fileBlob.size / 1024 / 1024);
|
|
447
|
-
return new Promise((resolve, reject) => {
|
|
448
|
-
console.log("进入了上传");
|
|
449
|
-
let observable = qiniu.upload(fileBlob, qiniuFileKey, this.qiniuConf?.uptoken, putExtra, config);
|
|
450
|
-
observable.subscribe({
|
|
451
|
-
next: (result_2) => {
|
|
452
|
-
// 主要用来展示进度
|
|
453
|
-
console.log("主要用来展示进度");
|
|
454
|
-
/**
|
|
455
|
-
* {"total":{"loaded":186290339,"size":714248116,"percent":26.082020354954636}}
|
|
456
|
-
*/
|
|
457
|
-
onProgress && onProgress(result_2);
|
|
458
|
-
console.log(JSON.stringify(result_2));
|
|
459
|
-
},
|
|
460
|
-
error: async (err_1) => {
|
|
461
|
-
console.log("上传失败");
|
|
462
|
-
// this.$notify('上传图片失败');
|
|
463
|
-
// await that.presentToast(`检测失败`, 1500, "danger")
|
|
464
|
-
console.log(JSON.stringify(err_1));
|
|
465
|
-
},
|
|
466
|
-
complete: (res_1) => {
|
|
467
|
-
console.log("上传完成");
|
|
468
|
-
console.log(JSON.stringify(res_1));
|
|
469
|
-
// console.log(`${this.qiniuConf?.domain}${res_1.key}`)
|
|
470
|
-
// res_1.url = `${this.qiniuConf?.domain}${res_1.key}`
|
|
471
|
-
// res_1.name = name
|
|
472
|
-
// res_1.type= type
|
|
473
|
-
// res_1.size = size;
|
|
474
|
-
mediafile.key = res_1.key;
|
|
475
|
-
console.log(mediafile.type);
|
|
476
|
-
mediafile.url = `${this.qiniuConf?.domain}${res_1.key}`;
|
|
477
|
-
console.log(mediafile.url);
|
|
478
|
-
resolve(mediafile);
|
|
479
|
-
},
|
|
480
|
-
});
|
|
481
|
-
});
|
|
482
|
-
}
|
|
483
|
-
//string转File文件
|
|
484
|
-
async base64ToBlobType(string, type) {
|
|
485
|
-
let base64Response = await fetch(`data:${type};base64,${string}`);
|
|
486
|
-
let blob = await base64Response.blob();
|
|
487
|
-
return blob;
|
|
488
|
-
string = atob(string);
|
|
489
|
-
return new Blob([string], {
|
|
490
|
-
type: type
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
//base64转File文件
|
|
494
|
-
async base64ToBlob(base64Img) {
|
|
495
|
-
let base64Response = await fetch(base64Img);
|
|
496
|
-
let blob = await base64Response.blob();
|
|
497
|
-
return blob;
|
|
498
|
-
}
|
|
499
|
-
fileToBlob(file) {
|
|
500
|
-
const blob = file.slice(0, file.size, file.type);
|
|
501
|
-
return new Blob([blob], { type: file.type });
|
|
502
|
-
}
|
|
503
|
-
genMd5(inputString) {
|
|
504
|
-
return CryptoJS.MD5(inputString).toString();
|
|
505
|
-
}
|
|
506
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, deps: [{ token: i1.Platform }, { token: i2.Diagnostic }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
507
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, providedIn: 'root' }); }
|
|
508
|
-
}
|
|
509
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, decorators: [{
|
|
510
|
-
type: Injectable,
|
|
511
|
-
args: [{
|
|
512
|
-
providedIn: 'root'
|
|
513
|
-
}]
|
|
514
|
-
}], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Diagnostic }] });
|
|
515
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm92YS11cGxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvc3RvcmFnZS9zZXJ2aWNlLXVwbG9hZC9ub3ZhLXVwbG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxLQUFLLE1BQU0sVUFBVSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDckUsd0VBQXdFO0FBQ3hFLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQTtBQUVoQzs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUE2QyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3BILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFrQnZEOzs7R0FHRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFTNUIsWUFDVSxRQUFpQixFQUNqQixVQUFzQjtRQUR0QixhQUFRLEdBQVIsUUFBUSxDQUFT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SSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBQztZQUN2QixJQUFJLEVBQUMsSUFBSTtTQUNWLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxlQUFlO0lBQ2YsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFpQjtRQUNsQyxJQUFJLGNBQWMsR0FBRyxNQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCxVQUFVLENBQUMsSUFBUztRQUNsQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE1BQU0sQ0FBQyxXQUFrQjtRQUN2QixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUMsQ0FBQzsrR0E1ZlUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuaW1wb3J0IHsgQ2FtZXJhLENhbWVyYVJlc3VsdFR5cGUsIENhbWVyYVNvdXJjZSB9IGZyb20gXCJAY2FwYWNpdG9yL2NhbWVyYVwiXHJcbmltcG9ydCB7IENhcGFjaXRvciB9IGZyb20gXCJAY2FwYWNpdG9yL2NvcmVcIjtcclxuaW1wb3J0IHsgRmlsZXN5c3RlbSB9IGZyb20gXCJAY2FwYWNpdG9yL2ZpbGVzeXN0ZW1cIjtcclxuaW1wb3J0IHsgRmlsZXN5c3RlbVdlYiB9IGZyb20gJ0BjYXBhY2l0b3IvZmlsZXN5c3RlbS9kaXN0L2VzbS93ZWIuanMnXHJcbmltcG9ydCAqIGFzIHFpbml1IGZyb20gXCJxaW5pdS1qc1wiXHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IHsgRGlhZ25vc3RpYyB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kaWFnbm9zdGljL25neCc7XHJcbi8vIGltcG9ydCB7IERpYWdub3N0aWMgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvZGlhZ25vc3RpYy9uZ3gnO1xyXG5pbXBvcnQgQ3J5cHRvSlMgZnJvbSBcImNyeXB0by1qc1wiXHJcblxyXG4vKipcclxuICogTWVkaWFDYXB0dXJl5o+S5Lu2XHJcbiAqIEBwcml2YXRlXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiDkvp3otZbvvJpGaWxlXHJcbiAqIG5wbSBpIC1TIGNvcmRvdmEtcGx1Z2luLWZpbGUgQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL2ZpbGVcclxuICovXHJcbmltcG9ydCB7IE1lZGlhQ2FwdHVyZSxNZWRpYUZpbGUsQ2FwdHVyZVZpZGVvT3B0aW9ucyxDYXB0dXJlRXJyb3IgfSBmcm9tIFwiQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL21lZGlhLWNhcHR1cmUvbmd4XCJcclxuaW1wb3J0IHsgY2FsY0ZpbGVNZDUgfSBmcm9tICcuL3V0aWwtZmlsZS1tZDUnO1xyXG5pbXBvcnQgeyBnZXRGaWxlTWV0YWRhdGEgfSBmcm9tICcuL3V0aWwtZmlsZS1tZXRhZGF0YSc7XHJcblxyXG4vKipcclxuICogTm92YUZpbGUg5paH5Lu257G75Z6LXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm92YUZpbGV7XHJcbiAgaWQ6c3RyaW5nXHJcbiAga2V5OnN0cmluZ1xyXG4gIHVybDpzdHJpbmdcclxuICBuYW1lOnN0cmluZ1xyXG4gIHR5cGU6c3RyaW5nXHJcbiAgc2l6ZTpudW1iZXJcclxuICBtZXRhZGF0YT86YW55XHJcbiAgbWQ1PzpzdHJpbmdcclxuICBhdHRhY2htZW50PzpQYXJzZS5PYmplY3RcclxufVxyXG5cclxuLyoqXHJcbiAqIE5vdmFVcGxvYWRTZXJ2aWNlIOS4iuS8oOacjeWKoVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOb3ZhVXBsb2FkU2VydmljZSB7XHJcblxyXG4gICAgc3RvcmU6UGFyc2UuT2JqZWN0XHJcbiAgXHJcbiAgY29tcGFueTpzdHJpbmdcclxuICB1cHRva2VuOnN0cmluZ1xyXG4gIHFpbml1Q29uZjphbnkgXHJcbiAgZG9tYWluOnN0cmluZ1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcGxhdGZvcm06UGxhdGZvcm0sXHJcbiAgICBwcml2YXRlIGRpYWdub3N0aWM6IERpYWdub3N0aWMsIFxyXG4gICkgeyBcclxuICAgIHRoaXMuZ2V0VXB0b2tlbih0cnVlKVxyXG4gICAgdGhpcy5yZXF1ZXN0UGVybWlzc2lvbigpO1xyXG4gICAgdGhpcy5xdWVyeURvbWFpbigpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiDlhajnq6/pgJrnlKjkuIrkvKDmlrnms5VcclxuICAgKiBAcGFyYW1zIGZpbGU6RmlsZSDlvoXkuIrkvKDmlofku7ZcclxuICAgKiBAcGFyYW1zIG9uUHJvZ3Jlc3M6RnVuY3Rpb24g5LiK5Lyg6L+b5bqm5Zue6LCD5Ye95pWwXHJcbiAgICogQHJldHVybnNcclxuICAgKiBwcm9ncmVzc0RhdGEge1xyXG4gICAgICAgICAgICBcInRvdGFsXCI6IHtcclxuICAgICAgICAgICAgICAgIFwic2l6ZVwiOiA4NDkxLFxyXG4gICAgICAgICAgICAgICAgXCJsb2FkZWRcIjogODQ5MCxcclxuICAgICAgICAgICAgICAgIFwicGVyY2VudFwiOiA5OS45ODgyMjI4MjQxNjY3NVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAqIG5vdmFmaWxlRGF0YSB7XHJcbiAgICAgICAgXCJpZFwiOlwieHh4eHh4eHh4eFwiIC8vIEF0dGFjaG1lbnQub2JqZWN0SWRcclxuICAgICAgXCJoYXNoXCI6IFwiRm9ZSGpweVRpZjF0OHVPTXY2TjZzVkllR1R2cVwiLFxyXG4gICAgICBcImtleVwiOiBcIkU0S3BHdlRFdG8vMjAyMzA5MDEvMDUzNjA1NDY3LmpwZ1wiLFxyXG4gICAgICBcInVybFwiOiBcImh0dHBzOi8vZmlsZS1jbG91ZC5mbW9kZS5jbi9FNEtwR3ZURXRvLzIwMjMwOTAxLzA1MzYwNTQ2Ny5qcGdcIixcclxuICAgICAgXCJuYW1lXCI6IFwiMjAyMzA5MDExNzM2MDUuanBnXCIsXHJcbiAgICAgIFwidHlwZVwiOiBcImltYWdlL2pwZ1wiLFxyXG4gICAgICBcInNpemVcIjogNzg1M1xyXG4gIH1cclxuICAgKi9cclxuICBhc3luYyB1cGxvYWQoZmlsZTpGaWxlLG9uUHJvZ3Jlc3M/OkZ1bmN0aW9uKTpQcm9taXNlPE5vdmFGaWxlPntcclxuICAgIC8vIOino+aekOaWh+S7tuexu+Wei++8jOW5tuiOt+W+l+aWh+S7tuWQjue8gFxyXG4gICAgbGV0IHR5cGUgPSBmaWxlLnR5cGUgXHJcblxyXG4gICAgbGV0IG5hbWVMaXN0ID0gZmlsZS5uYW1lPy5zcGxpdChcIi5cIilcclxuICAgIGxldCBmb3JtYXQgPSBuYW1lTGlzdFtuYW1lTGlzdC5sZW5ndGgtMV0gLy8g5paH5Lu25ZCO57yAXHJcblxyXG4gICAgLy8g6K6h566X5paH5Lu2bWQ1XHJcbiAgICBsZXQgdXBsb2FkRmlsZTpOb3ZhRmlsZSA9IHtpZDpcIlwiLG5hbWU6XCJcIix0eXBlOlwiXCIsc2l6ZTowLGtleTpcIlwiLHVybDpcIlwifVxyXG4gICAgbGV0IGZpbGVNZDUgPSBhd2FpdCB0aGlzLmdldEZpbGVNZDUoZmlsZSlcclxuICAgIGxldCBhdHRhY2ggPSBhd2FpdCB0aGlzLmdldEF0dGFjaEJ5TWQ1KGZpbGVNZDUpXHJcbiAgICBpZihhdHRhY2g/LmlkKXsgLy8g6Iul5a2Y5Zyo77yM55u05o6l6KGl5YWoXHJcbiAgICAgIHVwbG9hZEZpbGUudXJsID0gYXR0YWNoPy5nZXQoXCJ1cmxcIilcclxuICAgICAgdXBsb2FkRmlsZS5uYW1lID0gYXR0YWNoPy5nZXQoXCJuYW1lXCIpXHJcbiAgICAgIHVwbG9hZEZpbGUudHlwZSA9IGF0dGFjaD8uZ2V0KFwibWltZVwiKVxyXG4gICAgICB1cGxvYWRGaWxlLnNpemUgPSBhdHRhY2g/LmdldChcInNpemVcIilcclxuICAgICAgdXBsb2FkRmlsZS5tZXRhZGF0YSA9IGF0dGFjaD8uZ2V0KFwibWV0YWRhdGFcIilcclxuICAgICAgb25Qcm9ncmVzcyYmb25Qcm9ncmVzcyh7XCJ0b3RhbFwiOntcImxvYWRlZFwiOnVwbG9hZEZpbGUuc2l6ZSAsXCJzaXplXCI6dXBsb2FkRmlsZS5zaXplLFwicGVyY2VudFwiOjEwMH19KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIC8vIOi9rOaNouaWh+S7tmJsb2JcclxuICAgICAgbGV0IGJsb2IgPSB0aGlzLmZpbGVUb0Jsb2IoZmlsZSlcclxuICAgICAgXHJcbiAgICAgIC8vIOWbvueJh+S4iuS8oFxyXG4gICAgICBpZih0eXBlLmluZGV4T2YoJ2ltYWdlJyk+LTEpe1xyXG4gICAgICAgIHVwbG9hZEZpbGUgPSBhd2FpdCB0aGlzLnNhdmVRaW5pdUltYWdlRmlsZShibG9iLGZvcm1hdCxudWxsLG9uUHJvZ3Jlc3MpXHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHVwbG9hZEZpbGUgPSBhd2FpdCB0aGlzLnNhdmVRaW5pdU1lZGlhRmlsZShmaWxlLGJsb2IsbnVsbCxvblByb2dyZXNzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g57qg5q2jZmlsZS51cmxcclxuICAgIGlmKHVwbG9hZEZpbGU/LnVybD8uaW5kZXhPZigndW5kZWZpbmVkJyk+LTEpe1xyXG4gICAgICB1cGxvYWRGaWxlLnVybCA9ICh0aGlzLnFpbml1RG9tYWluIHx8IFwiaHR0cHM6Ly9maWxlLWNsb3VkLmZtb2RlLmNuL1wiKSArIHVwbG9hZEZpbGUudXJsLnJlcGxhY2UoXCJ1bmRlZmluZWQvXCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOihpeWFhW1ldGFkYXRhXHJcbiAgICBsZXQgYmFzZUluZm8gPSBhd2FpdCBnZXRGaWxlTWV0YWRhdGEoZmlsZSk7XHJcbiAgICBsZXQgbWV0YWRhdGEgPSBiYXNlSW5mby5tZXRhZGF0YTtcclxuICAgIGlmKCF1cGxvYWRGaWxlLm1ldGFkYXRhKSB1cGxvYWRGaWxlLm1ldGFkYXRhID0ge307XHJcbiAgICBPYmplY3Qua2V5cyhtZXRhZGF0YSkuZm9yRWFjaChrZXk9PntcclxuICAgICAgdXBsb2FkRmlsZS5tZXRhZGF0YVtrZXldID0gbWV0YWRhdGFba2V5XVxyXG4gICAgfSlcclxuICAgIGNvbnNvbGUubG9nKFwibWV0YWRhdGFcIixtZXRhZGF0YSx1cGxvYWRGaWxlKVxyXG5cclxuXHJcbiAgICAvLyDkv53lrZjpmYTku7ZcclxuICAgIGxldCBhdHRhY2htZW50XHJcbiAgICBpZih1cGxvYWRGaWxlPy51cmwpe1xyXG4gICAgICBhdHRhY2htZW50ID0gYXdhaXQgdGhpcy5zYXZlQXR0YWNobWVudCh1cGxvYWRGaWxlLHRoaXMucWluaXVEb21haW4sbnVsbCx0aGlzLmdldENvbXBhbnlJZCgpLGZpbGUpXHJcbiAgICB9XHJcbiAgICBpZihhdHRhY2htZW50Py5pZCl7XHJcbiAgICAgIHVwbG9hZEZpbGUuaWQgPSBhdHRhY2htZW50Py5pZFxyXG4gICAgfVxyXG4gICAgdXBsb2FkRmlsZS5hdHRhY2htZW50ID0gYXR0YWNobWVudDtcclxuICAgIHJldHVybiB1cGxvYWRGaWxlXHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRBdHRhY2hCeU1kNShmaWxlTWQ1OnN0cmluZyl7XHJcbiAgICBpZighZmlsZU1kNSkgcmV0dXJuIG51bGxcclxuICAgIGxldCBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcIkF0dGFjaG1lbnRcIik7XHJcbiAgICBxdWVyeS5lcXVhbFRvKFwibWQ1XCIsZmlsZU1kNSlcclxuICAgIHF1ZXJ5LmFkZERlc2NlbmRpbmcoXCJjcmVhdGVkQXRcIilcclxuICAgIGxldCBhdHRhY2ggPSBhd2FpdCBxdWVyeS5maXJzdCgpO1xyXG4gICAgcmV0dXJuIGF0dGFjaFxyXG4gIH1cclxuICAvKipcclxuICAgKiDnp7vliqjnq6/kuIrkvKDkuJPnlKjmlrnms5VcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBpc0NhcGFjaXRvcigpe1xyXG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaXMoXCJjYXBhY2l0b3JcIikgfHwgdGhpcy5wbGF0Zm9ybS5pcyhcImNvcmRvdmFcIilcclxuICB9XHJcbiAgYXN5bmMgZ2V0RmlsZU1kNShmaWxlOkZpbGUpOlByb21pc2U8c3RyaW5nPntcclxuICAgICAgbGV0IG1kNUZpbGVcclxuICAgICAgdHJ5e1xyXG4gICAgICAgIG1kNUZpbGUgPSBhd2FpdCBjYWxjRmlsZU1kNShmaWxlKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibWQ1RmlsZVwiLG1kNUZpbGUpXHJcbiAgICAgIH1jYXRjaChlcnJtZDUpe2NvbnNvbGUuZXJyb3IoZXJybWQ1KX1cclxuICAgIHJldHVybiBtZDVGaWxlXHJcbiAgfVxyXG4gIGFzeW5jIHJlcXVlc3RQZXJtaXNzaW9uKCl7XHJcbiAgICBpZighdGhpcy5pc0NhcGFjaXRvcigpKSByZXR1cm5cclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdFN0b2FnZVBlcm1pc3Npb24oKTtcclxuICAgIGF3YWl0IHRoaXMucmVxdWVzdENhbWVyYVBlcm1pc3Npb24oKTtcclxuICB9XHJcbiAgYXN5bmMgcmVxdWVzdFN0b2FnZVBlcm1pc3Npb24oKXtcclxuICAgICAgbGV0IGlzQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5kaWFnbm9zdGljLmlzRXh0ZXJuYWxTdG9yYWdlQXV0aG9yaXplZCgpXHJcbiAgICAgIGNvbnNvbGUubG9nKFwicGVybWlzc29uX1NUT1JBR0U6XCIsIGlzQXZhaWxhYmxlKVxyXG4gICAgICBpZiAoIWlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmRpYWdub3N0aWMucmVxdWVzdEV4dGVybmFsU3RvcmFnZUF1dGhvcml6YXRpb24oKVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVyblxyXG4gIH1cclxuICBhc3luYyByZXF1ZXN0Q2FtZXJhUGVybWlzc2lvbigpe1xyXG4gICAgbGV0IGlzQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5kaWFnbm9zdGljLmlzQ2FtZXJhQXV0aG9yaXplZCgpXHJcbiAgICBjb25zb2xlLmxvZyhcInBlcm1pc3Nvbl9DYW1lcmE6XCIsIGlzQXZhaWxhYmxlKVxyXG4gICAgaWYgKCFpc0F2YWlsYWJsZSkge1xyXG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZGlhZ25vc3RpYy5yZXF1ZXN0Q2FtZXJhQXV0aG9yaXphdGlvbigpXHJcbiAgICB9XHJcbiAgICByZXR1cm5cclxufVxyXG5cclxuLyoqXHJcbiAqIOS4iuS8oFRva2Vu6I635Y+W5pa55rOVXHJcbiAqIEByZXR1cm5zIFxyXG4gKi9cclxuICBhc3luYyBnZXRVcHRva2VuKHJlZnJlc2g6Ym9vbGVhbj1mYWxzZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJnZXRVcHRva2VuXCIpXHJcbiAgICBpZighdGhpcy5xaW5pdUNvbmYgJiYgIXJlZnJlc2gpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuZ2V0Q29tcGFueUlkKCkpXHJcbiAgICAgIGxldCBkYXRhID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwicWluaXVfdXB0b2tlblwiLCB7XHJcbiAgICAgICAgY29tcGFueTogdGhpcy5nZXRDb21wYW55SWQoKSxcclxuICAgICAgfSlcclxuICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgICAgdGhpcy5xaW5pdUNvbmYgPSBkYXRhXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIOeUn+aIkOaWh+S7tuS4iuS8oEtleeWAvO+8mjzlhazlj7hpZD4vPHl5eXltbWRkPi88ZmlsZS5pZD48aGhNTXNzPi48ZXh0PlxyXG4gICAqIEBkZXNjIOeUqOS6juWvueixoeWtmOWCqOWQq+WFqOi3r+W+hOeahOaWh+S7tuWQjeensFxyXG4gICAqL1xyXG4gIGdlbkZpbGVLZXkoZmlsZTp7aWQ6c3RyaW5nLG5hbWU6c3RyaW5nfSxjb21wYW55Pyl7XHJcbiAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpXHJcbiAgICBsZXQgZHAgPSBuZXcgRGF0ZVBpcGUoXCJlblwiKVxyXG4gICAgaWYoIWNvbXBhbnkpe1xyXG4gICAgICBjb21wYW55ID0gdGhpcy5nZXRDb21wYW55SWQoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICBsZXQgY29tUHJlZml4ID0gXCJzdG9yYWdlL2NvbXBhbnkvXCIgKyBjb21wYW55ICArIFwiL1wiIFxyXG4gICAgbGV0IHN0b3JlUHJlZml4ID0gXCJcIlxyXG4gICAgaWYodGhpcy5zdG9yZT8uaWQpe1xyXG4gICAgICBcInN0b3JlL1wiICsgdGhpcy5zdG9yZT8uaWQgKyBcIi9cIiBcclxuICAgIH1cclxuICAgIGxldCBmaWxlVW5pS2V5ID0gZHAudHJhbnNmb3JtKHRvZGF5LCBcInlNTWRkXCIpICsgXCIvXCIgKyBTdHJpbmcoZmlsZS5pZCkuc3Vic3RyKDIwLCA2KSArIGRwLnRyYW5zZm9ybSh0b2RheSwgXCJoaG1tc3NTU1NcIikgKyAvXFwuW15cXC5dKy8uZXhlYyhmaWxlLm5hbWUpXHJcblxyXG4gICAgcmV0dXJuIGNvbVByZWZpeCArIHN0b3JlUHJlZml4ICsgZmlsZVVuaUtleTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOiOt+WPluW9k+WJjeeZu+W9leeUqOaIt+WFrOWPuElEXHJcbiAgICogQHJldHVybnMg5YWs5Y+4SURcclxuICAgKi9cclxuICBnZXRDb21wYW55SWQoKXtcclxuICAgIC8vIOiOt+WPluWFrOWPuElE77yM5oiW5peg5oyH5a6a5YC877yM5YiZ6I635Y+WbG9jYWxTdG9yYWdl5LitY29tcGFueVxyXG4gICAgaWYodGhpcy5jb21wYW55KXtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tcGFueVxyXG4gICAgfVxyXG4gICAgbGV0IGlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXHJcbiAgICByZXR1cm4gaWRcclxuICB9XHJcbiAgcWluaXVEb21haW46c3RyaW5nXHJcbiAgYXN5bmMgcXVlcnlEb21haW4oKSB7XHJcbiAgICBsZXQgQ29tcGFueSA9IG5ldyBQYXJzZS5RdWVyeSgnQ29tcGFueScpXHJcbiAgICBsZXQgY29tcGFueSA9IGF3YWl0IENvbXBhbnkuZ2V0KHRoaXMuZ2V0Q29tcGFueUlkKCkpXHJcbiAgICBpZiAoY29tcGFueS5nZXQoXCJjb25maWdRaW5pdVwiKSAmJiBjb21wYW55LmdldChcImNvbmZpZ1Fpbml1XCIpLmRvbWFpbikge1xyXG4gICAgICBjb25zb2xlLmxvZyhjb21wYW55LmdldChcImNvbmZpZ1Fpbml1XCIpLmRvbWFpbilcclxuICAgICAgdGhpcy5xaW5pdURvbWFpbiA9IGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikuZG9tYWluO1xyXG4gICAgfSBlbHNle1xyXG4gICAgICB0aGlzLnFpbml1RG9tYWluID0gJ2h0dHBzOi8vZmlsZS1jbG91ZC5mbW9kZS5jbic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDkv53lrZjkuIrkvKDkv6Hmga/oh7PpmYTku7booaggQXR0YWNobWVudFxyXG4gICAqIEBwYXJhbSBmaWxlIOmZhOS7tuS/oeaBr1xyXG4gICAqIEByZXR1cm5zIGF0dGFjaG1lbnQgUGFyc2UuT2JqZWN0XHJcbiAgICovXHJcbiAgYXN5bmMgc2F2ZUF0dGFjaG1lbnQoZmlsZTpOb3ZhRmlsZXx7dXJsOnN0cmluZyxzaXplOnN0cmluZyxuYW1lOnN0cmluZyx0eXBlOnN0cmluZyxtZDU/OnN0cmluZyxtZXRhZGF0YT86YW55fSxkb21haW4sY2F0ZUlkPyxjb21wYW55PyxmaWxlU3JjPzpGaWxlKTpQcm9taXNlPFBhcnNlLk9iamVjdD4ge1xyXG4gICAgZmlsZS5tZDUgPSBhd2FpdCB0aGlzLmdldEZpbGVNZDUoZmlsZVNyYylcclxuICAgIGxldCB1cmwgPSBmaWxlLnVybFxyXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB1cmwgPSBkb21haW4gKyB1cmxcclxuICAgIH1cclxuICAgIHVybCA9IHVybC5yZXBsYWNlKC91bmRlZmluZWRcXC8vLCBcIlwiKTtcclxuXHJcblxyXG4gICAgLy8g5biQ5aWX5Y+C5pWw6buY6K6k5Yqg6L295pys5Zyw5a2Y5YKoXHJcbiAgICBpZighY29tcGFueSl7XHJcbiAgICAgIGNvbXBhbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIilcclxuICAgIH1cclxuICAgIGxldCB1c2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcblxyXG4gICAgbGV0IGF0dGFjaG1lbnQ6YW55XHJcblxyXG4gICAgaWYgKGF0dGFjaG1lbnQ/LmlkKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJmYXN0IHVwbG9hZFwiKTtcclxuICAgICAgICByZXR1cm4gYXR0YWNobWVudFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgQXR0YWNobWVudCA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJBdHRhY2htZW50XCIpXHJcbiAgICAgICAgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KCk7XHJcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJzaXplXCIsIGZpbGUuc2l6ZSlcclxuICAgICAgICBhdHRhY2htZW50LnNldChcInVybFwiLCB1cmwpXHJcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJuYW1lXCIsIGZpbGUubmFtZSlcclxuICAgICAgICBhdHRhY2htZW50LnNldChcIm1pbWVcIiwgZmlsZS50eXBlKVxyXG4gICAgICAgIGF0dGFjaG1lbnQuc2V0KFwibWQ1XCIsZmlsZT8ubWQ1KVxyXG4gICAgICAgIGF0dGFjaG1lbnQuc2V0KFwibWV0YWRhdGFcIixmaWxlPy5tZXRhZGF0YSlcclxuICAgICAgICBpZih0aGlzLnN0b3JlPy5pZCl7XHJcbiAgICAgICAgICBhdHRhY2htZW50LnNldChcInN0b3JlXCIsdGhpcy5zdG9yZS50b1BvaW50ZXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHVzZXI/LmlkKXtcclxuICAgICAgICAgIGF0dGFjaG1lbnQuc2V0KFwidXNlclwiLHVzZXIudG9Qb2ludGVyKCkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNvbXBhbnkpe1xyXG4gICAgICAgICAgYXR0YWNobWVudC5zZXQoXCJjb21wYW55XCIsIHtcclxuICAgICAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcclxuICAgICAgICAgICAgb2JqZWN0SWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY29tcGFueVwiKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhdGVJZCkge1xyXG4gICAgICAgICAgICBhdHRhY2htZW50LnNldChcImNhdGVnb3J5XCIsIHtcclxuICAgICAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQ2F0ZWdvcnlcIixcclxuICAgICAgICAgICAgICAgIG9iamVjdElkOiBjYXRlSWRcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGF0dGFjaG1lbnQuc2F2ZSgpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDlvZXlg4/lubbkuIrkvKBcclxuICovXHJcbmFzeW5jIGNhcHR1cmVWaWRlbyhjb25mKTogUHJvbWlzZTxhbnk+e1xyXG4gIHRoaXMucWluaXVDb25mID0gY29uZjtcclxuICBpZighdGhpcy5pc0NhcGFjaXRvcigpKSByZXR1cm47XHJcbiAgLy8ge1wibmFtZVwiOlwiVklEXzIwMjMwNTEzXzE4MjIzNS5tcDRcIixcImxvY2FsVVJMXCI6XCJodHRwczovL2xvY2FsaG9zdC9fX2NkdmZpbGVfc2RjYXJkX18vRENJTS9DYW1lcmEvVklEXzIwMjMwNTEzXzE4MjIzNS5tcDRcIixcInR5cGVcIjpcInZpZGVvL21wNFwiLFwibGFzdE1vZGlmaWVkXCI6bnVsbCxcImxhc3RNb2RpZmllZERhdGVcIjoxNjgzOTczMzU1MDAwLFwic2l6ZVwiOjYxMDAxNjEsXCJzdGFydFwiOjAsXCJlbmRcIjowLFwiZnVsbFBhdGhcIjpcImZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0RDSU0vQ2FtZXJhL1ZJRF8yMDIzMDUxM18xODIyMzUubXA0XCJ9XHJcbiAgbGV0IG1lZGlhRmlsZTphbnkgPSBhd2FpdCB0aGlzLmNhbWVyYUNhcHR1cmVWaWRlb0ZpbGUoKTtcclxuICAvLyBsZXQgbWVkaWFEYXRhOnN0cmluZyA9IGF3YWl0IHRoaXMuZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYUZpbGUpO1xyXG4gIGxldCBmaWxlQmxvYiA9IGF3YWl0IHRoaXMuZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYUZpbGUpO1xyXG4gIC8vIGxldCBmaWxlQmxvYiA9IGF3YWl0IHRoaXMuYmFzZTY0VG9CbG9iVHlwZShtZWRpYURhdGEsbWVkaWFGaWxlLnR5cGUpO1xyXG4gIGxldCBxaW5pdUZpbGUgPSBhd2FpdCB0aGlzLnNhdmVRaW5pdU1lZGlhRmlsZShtZWRpYUZpbGUsZmlsZUJsb2IpXHJcbiAgcmV0dXJuIHFpbml1RmlsZVxyXG59XHJcbmFzeW5jIGNhbWVyYUNhcHR1cmVWaWRlb0ZpbGUoKTpQcm9taXNlPE1lZGlhRmlsZXxhbnl8bnVsbD57XHJcbiAgbGV0IG9wdGlvbnM6IENhcHR1cmVWaWRlb09wdGlvbnMgPSB7XHJcbiAgICBsaW1pdDoxLFxyXG4gICAgLy8gcXVhbGl0eTo1MFxyXG4gIH1cclxuICBsZXQgbWVkaWFDYXB0dXJlOmFueSA9IE1lZGlhQ2FwdHVyZTtcclxuICBsZXQgbGlzdDpNZWRpYUZpbGVbXSB8IENhcHR1cmVFcnJvciAgfCBhbnk9IGF3YWl0IG1lZGlhQ2FwdHVyZS5jYXB0dXJlVmlkZW8ob3B0aW9ucylcclxuICBpZihsaXN0Py5sZW5ndGg+MCl7XHJcbiAgICByZXR1cm4gbGlzdFswXVxyXG4gIH1cclxuICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5cclxuYXN5bmMgZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYWZpbGUpe1xyXG4gIGxldCBmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW1XZWIoKVxyXG4gIGxldCBwYXRoID0gbWVkaWFmaWxlLmZ1bGxQYXRoLnJlcGxhY2VBbGwoXCIvLy9cIixcIi8vXCIpXHJcbiAgXHJcbiAgbGV0IHN0YXQgPSBhd2FpdCBGaWxlc3lzdGVtLnN0YXQoeyBwYXRoOm1lZGlhZmlsZS5mdWxsUGF0aH0pO1xyXG4gIGxldCB3ZWJVcmkgPSBDYXBhY2l0b3IuY29udmVydEZpbGVTcmMoc3RhdC51cmkpXHJcbiAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmZXRjaCh3ZWJVcmkpXHJcbiAgbGV0IGJsb2IgPSBhd2FpdCBjb250ZW50LmJsb2IoKVxyXG4gIGNvbnNvbGUubG9nKGJsb2Iuc2l6ZSlcclxuICBcclxuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzdGF0KSlcclxuICAvLyBDYXBhY2l0b3JDb252ZXJcclxuXHJcbiAgLy8gZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvRENJTS9DYW1lcmEvVklEXzIwMjMwNjEyXzEyNTkwNzAzMC5tcDRcclxuICAvLyBsZXQgZmlsZXN5c3RlbSA9IEZpbGVzeXN0ZW1cclxuICAvLyBsZXQgY29udGVudCA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZEZpbGUoe1xyXG4gIC8vICAgcGF0aDptZWRpYWZpbGUuZnVsbFBhdGhcclxuICAvLyB9KVxyXG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKVxyXG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKGNvbnRlbnQpKSlcclxuICAvLyBjb25zb2xlLmxvZyhjb250ZW50Py5kYXRhKVxyXG4gIGlmKGJsb2Ipe1xyXG4gICAgcmV0dXJuIGJsb2JcclxuICB9ZWxzZXtcclxuICAgIHRocm93IFwi6K+75Y+W5paH5Lu25aSx6LSlXCJcclxuICB9XHJcbn1cclxuICAvKipcclxuICAgKiDmi43nhaflubbkuIrkvKBcclxuICAgKiBAcmV0dXJucyAtLSB7aGFzaD86c3RyaW5nLHVybDpzdHJpbmcsbmFtZTpzdHJpbmcsc2l6ZTpudW1iZXIsa2V5OnN0aXJuZ31cclxuICAgKi9cclxuICBhc3luYyB0YWtlUGljdHVyZShjb25mKTogUHJvbWlzZTxhbnk+e1xyXG4gICAgdGhpcy5xaW5pdUNvbmYgPSBjb25mO1xyXG4gICAgaWYoIXRoaXMuaXNDYXBhY2l0b3IoKSkgcmV0dXJuXHJcbiAgICBhd2FpdCB0aGlzLmdldFVwdG9rZW4oKTtcclxuICAgIGxldCBpbWFnZSA9IGF3YWl0IHRoaXMuY2FtZXJhVGFrZVBpY3R1cmVEYXRhVXJsKClcclxuICAgIC8vIGltYWdlLmZvcm1hdFxyXG4gICAgaWYoIWltYWdlPy5kYXRhVXJsKSByZXR1cm5cclxuICAgIGxldCBibG9iID0gYXdhaXQgdGhpcy5iYXNlNjRUb0Jsb2IoaW1hZ2U/LmRhdGFVcmwpXHJcbiAgICBsZXQgcWluaXVGaWxlID0gYXdhaXQgdGhpcy5zYXZlUWluaXVJbWFnZUZpbGUoYmxvYixpbWFnZT8uZm9ybWF0KVxyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocWluaXVGaWxlKSlcclxuICAgIC8vIHRoaXMuc2F2ZUF0dGFjaG1lbnQoKVxyXG4gICAgcmV0dXJuIHFpbml1RmlsZVxyXG4gIH07XHJcbiAgYXN5bmMgY2FtZXJhVGFrZVBpY3R1cmVEYXRhVXJsKCl7IC8vIFdlYlVybCArIEJhc2U2NFxyXG4gICAgaWYoIXRoaXMuaXNDYXBhY2l0b3IoKSkgcmV0dXJuXHJcbiAgICBjb25zdCBpbWFnZSA9IGF3YWl0IENhbWVyYS5nZXRQaG90byh7XHJcbiAgICAgIHF1YWxpdHk6IDkwLFxyXG4gICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxyXG4gICAgICAvLyBzYXZlVG9HYWxsZXJ5OnRydWUsXHJcbiAgICAgIHNvdXJjZTpDYW1lcmFTb3VyY2UuQ2FtZXJhLFxyXG4gICAgICByZXN1bHRUeXBlOiBDYW1lcmFSZXN1bHRUeXBlLkRhdGFVcmxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGltYWdlO1xyXG4gIH1cclxuXHJcbiAgbWF4U2l6ZSA9IDUgKiAxMDI0ICogMTAyNFxyXG4gIC8qKlxyXG4gICAqIOS4g+eJm+S4iuS8oOWHveaVsO+8muaXoOmcgOWJjeerr+e7hOS7tlxyXG4gICAqIEBwYXJhbSBpbWFnZUJsb2I6IEJsb2JcclxuICAgKiBAcGFyYW0gZm9ybWF0OiBzdHJpbmdcclxuICAgKi9cclxuICAgYXN5bmMgc2F2ZVFpbml1SW1hZ2VGaWxlKGltYWdlQmxvYjogQmxvYixmb3JtYXQ6c3RyaW5nLGNvbXBhbnk/OnN0cmluZyxvblByb2dyZXNzPzpGdW5jdGlvbik6IFByb21pc2U8Tm92YUZpbGV8YW55PiB7XHJcbiAgICAvLyBsZXQgdGhhdCA9IHRoaXNcclxuICAgIGxldCBtYXhTaXplID0gdGhpcy5tYXhTaXplXHJcbiAgICBpZiAoaW1hZ2VCbG9iLnNpemUgPiBtYXhTaXplKSB7XHJcbiAgICAgIGF3YWl0IGNvbnNvbGUubG9nKGDnhafniYfov4flpKfvvIzotoXlh7rpmZDliLY1TUJgKVxyXG4gICAgICB0aHJvdyBcIui2heWHuuaWh+S7tuWkp+Wwj1wiXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRwID0gbmV3IERhdGVQaXBlKFwiZW5cIilcclxuICAgIGxldCBpZCA9IGRwLnRyYW5zZm9ybShuZXcgRGF0ZSgpLCBcInl5eXlNTWRkSEhtbXNzXCIpXHJcbiAgICBsZXQgbmFtZSA9IGAke2lkfS4ke2Zvcm1hdH1gXHJcbiAgICBsZXQgdHlwZSA9IGltYWdlQmxvYi50eXBlXHJcbiAgICAvLyBsZXQgZmlsZSA9IG5ldyBGaWxlKFtpbWFnZUJsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBcImltYWdlL2pwZWdcIiB9KVxyXG4gICAgbGV0IHB1dEV4dHJhID0ge1xyXG4gICAgICBmbmFtZTogbmFtZSxcclxuICAgICAgcGFyYW1zOiB7fSxcclxuICAgICAgLy8gbWltZVR5cGU6IFwiaW1hZ2UvKlwiLFxyXG4gICAgICBtaW1lVHlwZTppbWFnZUJsb2IudHlwZVxyXG4gICAgfVxyXG4gICAgbGV0IGNvbmZpZyA9IHtcclxuICAgICAgdXNlQ2RuRG9tYWluOiB0cnVlLCAvL+S9v+eUqGNkbuWKoOmAn1xyXG4gICAgICBmb3JjZURpcmVjdDp0cnVlIC8vIOW8uuWItuS4jeWIhueJh++8jOaUvue9ruS4iuS8oOaKpemUmVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5xaW5pdUNvbmYpXHJcblxyXG4gICAgbGV0IHFpbml1RmlsZUtleSA9IHRoaXMuZ2VuRmlsZUtleSh7aWQ6aWQsbmFtZTpuYW1lfSlcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIuWbvueJh+S4iuS8oOWJjVwiKVxyXG4gICAgY29uc29sZS5sb2cocWluaXVGaWxlS2V5LGltYWdlQmxvYixmb3JtYXQpXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLov5vlhaXkuobkuIrkvKBcIilcclxuICAgICAgICBsZXQgb2JzZXJ2YWJsZSA9IChxaW5pdSBhcyBhbnkpLnVwbG9hZChcclxuICAgICAgICAgIGltYWdlQmxvYixcclxuICAgICAgICAgIHFpbml1RmlsZUtleSxcclxuICAgICAgICAgIHRoaXMucWluaXVDb25mPy51cHRva2VuLFxyXG4gICAgICAgICAgcHV0RXh0cmEsXHJcbiAgICAgICAgICBjb25maWdcclxuICAgICAgICApXHJcbiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlc3VsdF8yKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIOS4u+imgeeUqOadpeWxleekuui/m+W6plxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRfMilcclxuICAgICAgICAgICAgb25Qcm9ncmVzcyYmb25Qcm9ncmVzcyhyZXN1bHRfMilcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogYXN5bmMgKGVycl8xKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuJG5vdGlmeSgn5LiK5Lyg5Zu+54mH5aSx6LSlJyk7XHJcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoYXQucHJlc2VudFRvYXN0KGDmo4DmtYvlpLHotKVgLCAxNTAwLCBcImRhbmdlclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJfMSlcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21wbGV0ZTogKHJlc18xKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5a6M5oiQXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YClcclxuICAgICAgICAgICAgcmVzXzEudXJsID0gYCR7dGhpcy5xaW5pdUNvbmY/LmRvbWFpbn0ke3Jlc18xLmtleX1gXHJcbiAgICAgICAgICAgIHJlc18xLm5hbWUgPSBuYW1lXHJcbiAgICAgICAgICAgIHJlc18xLnR5cGU9IHR5cGVcclxuICAgICAgICAgICAgcmVzXzEuc2l6ZSA9IGltYWdlQmxvYi5zaXplO1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc18xKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxuICBhc3luYyBzYXZlUWluaXVNZWRpYUZpbGUobWVkaWFmaWxlOmFueSxmaWxlQmxvYjogQmxvYixjb21wYW55PzpzdHJpbmcsb25Qcm9ncmVzcz86RnVuY3Rpb24pOiBQcm9taXNlPE5vdmFGaWxlfGFueT4ge1xyXG4gICAgLy8gbGV0IHRoYXQgPSB0aGlzXHJcbiAgICBsZXQgbmFtZSA9IG1lZGlhZmlsZS5uYW1lXHJcbiAgICBsZXQgdHlwZSA9IG1lZGlhZmlsZS50eXBlXHJcbiAgICBsZXQgc2l6ZSA9IG1lZGlhZmlsZS5zaXplXHJcbiAgICBsZXQgbWF4U2l6ZSA9IHRoaXMubWF4U2l6ZSB8fCAxMDAgKiAxMDI0ICogMTAyNCAvLyDpmZAxMDBNXHJcbiAgICBpZiAoc2l6ZSA+IG1heFNpemUpIHtcclxuICAgICAgY29uc29sZS5sb2coYOinhumikei/h+Wkp++8jOi2heWHuumZkOWItjEwME1CYClcclxuICAgICAgdGhyb3cgXCLotoXlh7rmlofku7blpKflsI9cIlxyXG4gICAgfVxyXG4gICAgbGV0IGRwID0gbmV3IERhdGVQaXBlKFwiZW5cIilcclxuICAgIGxldCBpZCA9IGRwLnRyYW5zZm9ybShuZXcgRGF0ZSgpLCBcInl5eXlNTWRkSEhtbXNzXCIpXHJcbiAgICAvLyBsZXQgZmlsZSA9IG5ldyBGaWxlKFttZWRpYUJsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBcImltYWdlL2pwZWdcIiB9KVxyXG4gICAgbGV0IHB1dEV4dHJhID0ge1xyXG4gICAgICBmbmFtZTogbmFtZSxcclxuICAgICAgcGFyYW1zOiB7fSxcclxuICAgICAgbWltZVR5cGU6IHR5cGUsXHJcbiAgICB9XHJcbiAgICBsZXQgY29uZmlnID0ge1xyXG4gICAgICB1c2VDZG5Eb21haW46IHRydWUsIC8v5L2/55SoY2Ru5Yqg6YCfXHJcbiAgICAgIGZvcmNlRGlyZWN0OnRydWUgLy8g5by65Yi25LiN5YiG54mH77yM5pS+572u5LiK5Lyg5oql6ZSZXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHFpbml1RmlsZUtleSA9IHRoaXMuZ2VuRmlsZUtleSh7aWQ6aWQsbmFtZTpuYW1lfSlcclxuICAgIGNvbnNvbGUubG9nKFwi5Zu+54mH5LiK5Lyg5YmNXCIpXHJcbiAgICBjb25zb2xlLmxvZyhtZWRpYWZpbGUubmFtZSxmaWxlQmxvYi5zaXplKVxyXG4gICAgY29uc29sZS5sb2coZmlsZUJsb2Iuc2l6ZSlcclxuICAgIGNvbnNvbGUubG9nKGZpbGVCbG9iLnNpemUvMTAyNC8xMDI0KVxyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi6L+b5YWl5LqG5LiK5LygXCIpXHJcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSAocWluaXUgYXMgYW55KS51cGxvYWQoXHJcbiAgICAgICAgICBmaWxlQmxvYixcclxuICAgICAgICAgIHFpbml1RmlsZUtleSxcclxuICAgICAgICAgIHRoaXMucWluaXVDb25mPy51cHRva2VuLFxyXG4gICAgICAgICAgcHV0RXh0cmEsXHJcbiAgICAgICAgICBjb25maWdcclxuICAgICAgICApXHJcbiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlc3VsdF8yKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIOS4u+imgeeUqOadpeWxleekuui/m+W6plxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4u+imgeeUqOadpeWxleekuui/m+W6plwiKVxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICoge1widG90YWxcIjp7XCJsb2FkZWRcIjoxODYyOTAzMzksXCJzaXplXCI6NzE0MjQ4MTE2LFwicGVyY2VudFwiOjI2LjA4MjAyMDM1NDk1NDYzNn19XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBvblByb2dyZXNzJiZvblByb2dyZXNzKHJlc3VsdF8yKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRfMikpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IGFzeW5jIChlcnJfMSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuS8oOWksei0pVwiKVxyXG4gICAgICAgICAgICAvLyB0aGlzLiRub3RpZnkoJ+S4iuS8oOWbvueJh+Wksei0pScpO1xyXG4gICAgICAgICAgICAvLyBhd2FpdCB0aGF0LnByZXNlbnRUb2FzdChg5qOA5rWL5aSx6LSlYCwgMTUwMCwgXCJkYW5nZXJcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyXzEpKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvbXBsZXRlOiAocmVzXzEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDlrozmiJBcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzXzEpKVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgJHt0aGlzLnFpbml1Q29uZj8uZG9tYWlufSR7cmVzXzEua2V5fWApXHJcbiAgICAgICAgICAgIC8vIHJlc18xLnVybCA9IGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YFxyXG4gICAgICAgICAgICAvLyByZXNfMS5uYW1lID0gbmFtZVxyXG4gICAgICAgICAgICAvLyByZXNfMS50eXBlPSB0eXBlXHJcbiAgICAgICAgICAgIC8vIHJlc18xLnNpemUgPSBzaXplO1xyXG4gICAgICAgICAgICBtZWRpYWZpbGUua2V5ID0gcmVzXzEua2V5XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lZGlhZmlsZS50eXBlKVxyXG4gICAgICAgICAgICBtZWRpYWZpbGUudXJsID0gYCR7dGhpcy5xaW5pdUNvbmY/LmRvbWFpbn0ke3Jlc18xLmtleX1gXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lZGlhZmlsZS51cmwpXHJcbiAgICAgICAgICAgIHJlc29sdmUobWVkaWFmaWxlKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy9zdHJpbmfovaxGaWxl5paH5Lu2XHJcbiAgYXN5bmMgYmFzZTY0VG9CbG9iVHlwZShzdHJpbmcsdHlwZSl7XHJcbiAgICBsZXQgYmFzZTY0UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgZGF0YToke3R5cGV9O2Jhc2U2NCwke3N0cmluZ31gKTtcclxuICAgIGxldCBibG9iID0gYXdhaXQgYmFzZTY0UmVzcG9uc2UuYmxvYigpO1xyXG4gICAgcmV0dXJuIGJsb2JcclxuICAgIHN0cmluZyA9IGF0b2Ioc3RyaW5nKVxyXG4gICAgcmV0dXJuIG5ldyBCbG9iKFtzdHJpbmddLHtcclxuICAgICAgdHlwZTp0eXBlXHJcbiAgICB9KVxyXG4gIH1cclxuICAvL2Jhc2U2NOi9rEZpbGXmlofku7ZcclxuICBhc3luYyBiYXNlNjRUb0Jsb2IoYmFzZTY0SW1nOiBzdHJpbmcpIHtcclxuICAgIGxldCBiYXNlNjRSZXNwb25zZSA9IGF3YWl0IGZldGNoKGJhc2U2NEltZyk7XHJcbiAgICBsZXQgYmxvYiA9IGF3YWl0IGJhc2U2NFJlc3BvbnNlLmJsb2IoKTtcclxuICAgIHJldHVybiBibG9iXHJcbiAgfVxyXG4gIGZpbGVUb0Jsb2IoZmlsZTpGaWxlKTpCbG9iIHtcclxuICAgIGNvbnN0IGJsb2IgPSBmaWxlLnNsaWNlKDAsIGZpbGUuc2l6ZSwgZmlsZS50eXBlKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbYmxvYl0sIHsgdHlwZTogZmlsZS50eXBlIH0pO1xyXG4gIH1cclxuICBnZW5NZDUoaW5wdXRTdHJpbmc6c3RyaW5nKXtcclxuICAgIHJldHVybiBDcnlwdG9KUy5NRDUoaW5wdXRTdHJpbmcpLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
8
|
+
import{DatePipe}from"@angular/common";import{Injectable}from"@angular/core";import{Platform}from"@ionic/angular";import{Camera,CameraResultType,CameraSource}from"@capacitor/camera";import{Capacitor}from"@capacitor/core";import{Filesystem}from"@capacitor/filesystem";import{FilesystemWeb}from"@capacitor/filesystem/dist/esm/web.js";import*as qiniu from"qiniu-js";import{FmodeParse}from"@fmode/parse";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import CryptoJS from"crypto-js";import{MediaCapture}from"@awesome-cordova-plugins/media-capture/ngx";import{calcFileMd5}from"./util-file-md5";import{getFileMetadata}from"./util-file-metadata";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@awesome-cordova-plugins/diagnostic/ngx";const Parse=FmodeParse.with("nova");export class NovaUploadService{constructor(e,t){this.platform=e,this.diagnostic=t,this.maxSize=5242880,this.getUptoken(!0),this.requestPermission(),this.queryDomain()}async upload(e,t){let i=e.type,a=e.name?.split("."),o=a[a.length-1],s={id:"",name:"",type:"",size:0,key:"",url:""},r=await this.getFileMd5(e),n=await this.getAttachByMd5(r);if(n?.id)s.url=n?.get("url"),s.name=n?.get("name"),s.type=n?.get("mime"),s.size=n?.get("size"),s.metadata=n?.get("metadata"),t&&t({total:{loaded:s.size,size:s.size,percent:100}});else{let a=this.fileToBlob(e);s=i.indexOf("image")>-1?await this.saveQiniuImageFile(a,o,null,t):await this.saveQiniuMediaFile(e,a,null,t)}s?.url?.indexOf("undefined")>-1&&(s.url=(this.qiniuDomain||"https://file-cloud.fmode.cn/")+s.url.replace("undefined/",""));let l,c=(await getFileMetadata(e)).metadata;return s.metadata||(s.metadata={}),Object.keys(c).forEach((e=>{s.metadata[e]=c[e]})),console.log("metadata",c,s),s?.url&&(l=await this.saveAttachment(s,this.qiniuDomain,null,this.getCompanyId(),e)),l?.id&&(s.id=l?.id),s.attachment=l,s}async getAttachByMd5(e){if(!e)return null;let t=new Parse.Query("Attachment");return t.equalTo("md5",e),t.addDescending("createdAt"),await t.first()}isCapacitor(){return this.platform.is("capacitor")||this.platform.is("cordova")}async getFileMd5(e){let t;try{t=await calcFileMd5(e),console.log("md5File",t)}catch(e){console.error(e)}return t}async requestPermission(){this.isCapacitor()&&(await this.requestStoagePermission(),await this.requestCameraPermission())}async requestStoagePermission(){let e=await this.diagnostic.isExternalStorageAuthorized();if(console.log("permisson_STORAGE:",e),!e){await this.diagnostic.requestExternalStorageAuthorization()}}async requestCameraPermission(){let e=await this.diagnostic.isCameraAuthorized();if(console.log("permisson_Camera:",e),!e){await this.diagnostic.requestCameraAuthorization()}}async getUptoken(e=!1){if(console.log("getUptoken"),this.qiniuConf||e)try{console.log(this.getCompanyId());let e=await Parse.Cloud.run("qiniu_uptoken",{company:this.getCompanyId()});console.log(e),this.qiniuConf=e}catch(e){console.error(e)}}genFileKey(e,t){let i=new Date,a=new DatePipe("en");t||(t=this.getCompanyId());let o="storage/company/"+t+"/";return this.store?.id&&this.store?.id,o+""+(a.transform(i,"yMMdd")+"/"+String(e.id).substr(20,6)+a.transform(i,"hhmmssSSS")+/\.[^\.]+/.exec(e.name))}getCompanyId(){if(this.company)return this.company;return localStorage.getItem("company")}async queryDomain(){let e=new Parse.Query("Company"),t=await e.get(this.getCompanyId());t.get("configQiniu")&&t.get("configQiniu").domain?(console.log(t.get("configQiniu").domain),this.qiniuDomain=t.get("configQiniu").domain):this.qiniuDomain="https://file-cloud.fmode.cn"}async saveAttachment(e,t,i,a,o){e.md5=await this.getFileMd5(o);let s=e.url;s.startsWith("http")||(s=t+s),s=s.replace(/undefined\//,""),a||(a=localStorage.getItem("company"));let r,n=Parse.User.current();if(r?.id)return console.log("fast upload"),r;Parse.Object.extend("Attachment");return r=new Parse.Object("Attachment"),r.set("size",e.size),r.set("url",s),r.set("name",e.name),r.set("mime",e.type),r.set("md5",e?.md5),r.set("metadata",e?.metadata),this.store?.id&&r.set("store",this.store.toPointer()),n?.id&&r.set("user",n.toPointer()),a&&r.set("company",{__type:"Pointer",className:"Company",objectId:localStorage.getItem("company")}),i&&r.set("category",{__type:"Pointer",className:"Category",objectId:i}),await r.save()}async captureVideo(e){if(this.qiniuConf=e,!this.isCapacitor())return;let t=await this.cameraCaptureVideoFile(),i=await this.getMediaFileDataString(t);return await this.saveQiniuMediaFile(t,i)}async cameraCaptureVideoFile(){let e=MediaCapture,t=await e.captureVideo({limit:1});return t?.length>0?t[0]:null}async getMediaFileDataString(e){new FilesystemWeb,e.fullPath.replaceAll("///","//");let t=await Filesystem.stat({path:e.fullPath}),i=Capacitor.convertFileSrc(t.uri),a=await fetch(i),o=await a.blob();if(console.log(o.size),console.log(JSON.stringify(t)),console.log(JSON.stringify(a)),console.log(JSON.stringify(Object.keys(a))),o)return o;throw"读取文件失败"}async takePicture(e){if(this.qiniuConf=e,!this.isCapacitor())return;await this.getUptoken();let t=await this.cameraTakePictureDataUrl();if(!t?.dataUrl)return;let i=await this.base64ToBlob(t?.dataUrl),a=await this.saveQiniuImageFile(i,t?.format);return console.log(JSON.stringify(a)),a}async cameraTakePictureDataUrl(){if(!this.isCapacitor())return;return await Camera.getPhoto({quality:90,allowEditing:!1,source:CameraSource.Camera,resultType:CameraResultType.DataUrl})}async saveQiniuImageFile(e,t,i,a){let o=this.maxSize;if(e.size>o)throw await console.log("照片过大,超出限制5MB"),"超出文件大小";let s=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),r=`${s}.${t}`,n=e.type,l={fname:r,params:{},mimeType:e.type},c={useCdnDomain:!0,forceDirect:!0};console.log(this.qiniuConf);let m=this.genFileKey({id:s,name:r});return console.log("图片上传前"),console.log(m,e,t),new Promise(((t,i)=>{console.log("进入了上传"),qiniu.upload(e,m,this.qiniuConf?.uptoken,l,c).subscribe({next:e=>{console.log(e),a&&a(e)},error:async e=>{console.log(e)},complete:i=>{console.log("上传完成"),console.log(`${this.qiniuConf?.domain}${i.key}`),i.url=`${this.qiniuConf?.domain}${i.key}`,i.name=r,i.type=n,i.size=e.size,t(i)}})}))}async saveQiniuMediaFile(e,t,i,a){let o=e.name,s=e.type;if(e.size>(this.maxSize||104857600))throw console.log("视频过大,超出限制100MB"),"超出文件大小";let r=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),n={fname:o,params:{},mimeType:s},l={useCdnDomain:!0,forceDirect:!0},c=this.genFileKey({id:r,name:o});return console.log("图片上传前"),console.log(e.name,t.size),console.log(t.size),console.log(t.size/1024/1024),new Promise(((i,o)=>{console.log("进入了上传"),qiniu.upload(t,c,this.qiniuConf?.uptoken,n,l).subscribe({next:e=>{console.log("主要用来展示进度"),a&&a(e),console.log(JSON.stringify(e))},error:async e=>{console.log("上传失败"),console.log(JSON.stringify(e))},complete:t=>{console.log("上传完成"),console.log(JSON.stringify(t)),e.key=t.key,console.log(e.type),e.url=`${this.qiniuConf?.domain}${t.key}`,console.log(e.url),i(e)}})}))}async base64ToBlobType(e,t){let i=await fetch(`data:${t};base64,${e}`);return await i.blob()}async base64ToBlob(e){let t=await fetch(e);return await t.blob()}fileToBlob(e){const t=e.slice(0,e.size,e.type);return new Blob([t],{type:e.type})}genMd5(e){return CryptoJS.MD5(e).toString()}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,deps:[{token:i1.Platform},{token:i2.Diagnostic}],target:i0.ɵɵFactoryTarget.Injectable})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Diagnostic}]});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2UubWpz`
|
|
10
|
+
|