VncScreenshot.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{action}}</div>
  4. <div slot="body">
  5. <div class="screenshot-wrapper">
  6. <img style="width: 100%" :src="screenshotUrl" />
  7. </div>
  8. </div>
  9. <div slot="footer">
  10. <a-button type="primary" @click="downloadScreenshot">{{ $t('common.download_screenshot') }}</a-button>
  11. <a-button @click="cancelDialog">{{ $t('common_115') }}</a-button>
  12. </div>
  13. </base-dialog>
  14. </template>
  15. <script>
  16. import DialogMixin from '@/mixins/dialog'
  17. import WindowsMixin from '@/mixins/windows'
  18. import { ppmToPNGDataURL } from '@/utils/utils'
  19. export default {
  20. name: 'VmVncScreenshotDialog',
  21. mixins: [DialogMixin, WindowsMixin],
  22. data () {
  23. const { canvas, url } = ppmToPNGDataURL(this.params.screenshotUrl.replace('data:application/octet-stream;base64,', ''))
  24. return {
  25. action: this.$t('compute.vnc_panic_screenshot'),
  26. screenshotUrl: url,
  27. canvas,
  28. }
  29. },
  30. methods: {
  31. downloadScreenshot () {
  32. const that = this
  33. if (this.canvas) {
  34. this.canvas.toBlob(function (blob) {
  35. const url = URL.createObjectURL(blob)
  36. const a = document.createElement('a')
  37. a.href = url
  38. a.download = `server-panicked-screenshot-${that.params.data.id}.png`
  39. a.click()
  40. URL.revokeObjectURL(url)
  41. }, 'image/png')
  42. }
  43. },
  44. },
  45. }
  46. </script>