fix: paste image file

This commit is contained in:
ShawnPhang 2025-03-22 13:11:55 +08:00
parent 70f3bfa36e
commit d1f79cf391
2 changed files with 58 additions and 50 deletions

View File

@ -3,7 +3,7 @@
* @Date: 2022-03-09 16:29:54 * @Date: 2022-03-09 16:29:54
* @Description: ctrl建相关的操作 * @Description: ctrl建相关的操作
* @LastEditors: ShawnPhang <https://m.palxp.cn> * @LastEditors: ShawnPhang <https://m.palxp.cn>
* @LastEditTime: 2025-02-12 18:52:35 * @LastEditTime: 2025-03-22 12:56:29
*/ */
// import store from '@/store' // import store from '@/store'
import handlePaste from './handlePaste' import handlePaste from './handlePaste'
@ -69,16 +69,23 @@ function copy() {
/** /**
* *
*/ */
function paste() { let pasteImageFile: any = null
handlePaste().then(() => { document.addEventListener('paste', async (e: any) => {
const widgetStore = useWidgetStore() const file = e.clipboardData.files[0]
if (widgetStore.dCopyElement.length === 0) { pasteImageFile = file && file.type.startsWith('image') ? file : null
return })
} else if (widgetStore.dActiveElement?.isContainer && checkGroupChild(widgetStore.dActiveElement?.uuid, 'editable')) { async function paste() {
return setTimeout(() => {
} handlePaste(pasteImageFile).then(() => {
!widgetStore.dActiveElement?.editable && widgetStore.pasteWidget() const widgetStore = useWidgetStore()
}) if (widgetStore.dCopyElement.length === 0) {
return
} else if (widgetStore.dActiveElement?.isContainer && checkGroupChild(widgetStore.dActiveElement?.uuid, 'editable')) {
return
}
!widgetStore.dActiveElement?.editable && widgetStore.pasteWidget()
})
}, 10)
} }
/** /**
* *

View File

@ -3,7 +3,7 @@
* @Date: 2023-10-09 09:47:40 * @Date: 2023-10-09 09:47:40
* @Description: * @Description:
* @LastEditors: ShawnPhang <https://m.palxp.cn> * @LastEditors: ShawnPhang <https://m.palxp.cn>
* @LastEditTime: 2024-03-15 17:35:18 * @LastEditTime: 2025-03-22 13:09:08
*/ */
// window.addEventListener('paste', (e: any) => { // window.addEventListener('paste', (e: any) => {
@ -23,7 +23,7 @@ import eventBus from '@/utils/plugins/eventBus'
import { useControlStore, useCanvasStore, useWidgetStore } from '@/store' import { useControlStore, useCanvasStore, useWidgetStore } from '@/store'
// import wText from '@/components/modules/widgets/wText/wText.vue' // import wText from '@/components/modules/widgets/wText/wText.vue'
export default () => { export default (pasteImageFile?: any) => {
return new Promise<void>((resolve) => { return new Promise<void>((resolve) => {
const pageStore = useCanvasStore() const pageStore = useCanvasStore()
const widgetStore = useWidgetStore() const widgetStore = useWidgetStore()
@ -35,55 +35,24 @@ export default () => {
if (widgetStore.dActiveElement?.editable) { if (widgetStore.dActiveElement?.editable) {
return return
} }
if (pasteImageFile) {
uploadParseImage(pasteImageFile, { controlStore, pageStore, widgetStore })
return
}
for (let i = 0; i < dataTransfer.length; i++) { for (let i = 0; i < dataTransfer.length; i++) {
const item = dataTransfer[i] const item = dataTransfer[i]
if (item.types.toString().indexOf('image') !== -1) { if (item.types.toString().indexOf('image') !== -1) {
const imageBlob = await item.getType(item.types[0]) const imageBlob = await item.getType(item.types[0])
const file = new File([imageBlob], 'screenshot.png', { type: 'image/png' }) const file = new File([imageBlob], 'screenshot.png', { type: 'image/png' })
// 上传图片 uploadParseImage(file, { controlStore, pageStore, widgetStore })
const qnOptions = { bucket: 'xp-design', prePath: 'user' }
const result = await Qiniu.upload(file, qnOptions)
const { width, height } = await getImage(file)
const url = _config.IMG_URL + result.key
await api.material.addMyPhoto({ width, height, url })
// 刷新用户列表
eventBus.emit('refreshUserImages')
// 添加图片到画布中
// store.commit('setShowMoveable', false) // 清理掉上一次的选择
controlStore.setShowMoveable(false) // 清理掉上一次的选择
const setting = JSON.parse(JSON.stringify(wImageSetting))
setting.width = width
setting.height = height
setting.imgUrl = url
const { width: pW, height: pH } = pageStore.dPage
setting.left = pW / 2 - width / 2
setting.top = pH / 2 - height / 2
widgetStore.addWidget(setting)
// store.dispatch('addWidget', setting)
// 清空剪贴板,防止多次上传图片
navigator.clipboard.write([
new ClipboardItem({
'text/plain': new Blob([''], {type: 'text/plain'})
})
])
// 最后尝试复制,将图片替换为图片组件
setTimeout(() => {
widgetStore.copyWidget()
// store.dispatch('copyWidget')
}, 100)
break break
} else if (item.types.toString().indexOf('text') !== -1) { } else if (item.types.toString().indexOf('text') !== -1) {
// store.commit('setShowMoveable', false) // 清理掉上一次的选择
controlStore.setShowMoveable(false) // 清理掉上一次的选择 controlStore.setShowMoveable(false) // 清理掉上一次的选择
const setting = JSON.parse(JSON.stringify(wTextSetting)) const setting = JSON.parse(JSON.stringify(wTextSetting))
setting.text = await navigator.clipboard.readText() setting.text = await navigator.clipboard.readText()
widgetStore.addWidget(setting) widgetStore.addWidget(setting)
// store.dispatch('addWidget', setting)
break break
} else resolve() } else resolve()
} }
@ -94,3 +63,35 @@ export default () => {
}) })
}) })
} }
async function uploadParseImage(file: File, { controlStore, pageStore, widgetStore }: any) {
// 上传图片
const resp = await api.material.upload({ file }, (up: any, dp: any) => {
console.log(up, dp)
})
const { width, height } = await getImage(file)
try {
await api.material.addMyPhoto({ ...resp, width, height })
} catch (error) {}
// 刷新用户列表
eventBus.emit('refreshUserImages')
// 添加图片到画布中
controlStore.setShowMoveable(false) // 清理掉上一次的选择
const setting = JSON.parse(JSON.stringify(wImageSetting))
setting.width = width
setting.height = height
setting.imgUrl = resp?.url
const { width: pW, height: pH } = pageStore.dPage
setting.left = pW / 2 - width / 2
setting.top = pH / 2 - height / 2
widgetStore.addWidget(setting)
// 清空剪贴板,防止多次上传图片
navigator.clipboard.write([
new ClipboardItem({
'text/plain': new Blob([''], { type: 'text/plain' }),
}),
])
// 最后尝试复制,将图片替换为图片组件
setTimeout(() => {
widgetStore.copyWidget()
}, 100)
}