From 8d8b8d223c5a18954e5968b08cefd35b3e694e6a Mon Sep 17 00:00:00 2001 From: zdg Date: Tue, 21 Jan 2025 14:15:15 +0800 Subject: [PATCH] =?UTF-8?q?ppt=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/views/prepare/index.vue | 93 +++++++++++++++--------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/src/renderer/src/views/prepare/index.vue b/src/renderer/src/views/prepare/index.vue index 6d69db6..8a9d5c6 100644 --- a/src/renderer/src/views/prepare/index.vue +++ b/src/renderer/src/views/prepare/index.vue @@ -289,7 +289,8 @@ export default { { color: '#5cb87a', percentage: 100 }, // 绿色 ] } - } + }, + pptMedia: {} // ppt媒体数据 } }, computed: { @@ -591,52 +592,76 @@ export default { this.createAIPPTByFile(file, this.currentNode.itemtitle + '.aippt') } }, + // 将图片|音频|视频 转换为线上地址 + getOnlineFileUrl(data, name){ + return new Promise(async (resolve, reject) => { + let file + if (data instanceof Blob) { // blob类型判断 + const fileName = Date.now() + `.${name||'png'}` + file = commUtils.blobToFile(data, fileName) + } else if (data instanceof File) { // file类型判断 + file = data + } else { // 其他类型 base64 + const blob = commUtils.base64ToBlob(data) + const fileName = Date.now() + `.${name||'png'}` + file = commUtils.blobToFile(blob, fileName) + } + const formData = new FormData() + formData.append('file', file) + const res = await Api_server.Other.uploadFile(formData) + if (res && res.code == 200){ + resolve(res?.url) + } else { // 失败 + reject(res?.msg||'上传失败') + } + }) + }, async toRousrceUrl(o) { if (!!o.src) { // 如果有src就转换 const isBase64 = /^data:image\/(\w+);base64,/.test(o.src) const isBlobUrl = /^blob:/.test(o.src) - // console.log('isBase64', o, isBase64) - if (isBase64) { - const bolb = commUtils.base64ToBlob(o.src) - const fileName = Date.now() + '.png' - const file = commUtils.blobToFile(bolb, fileName) - // o.src = fileName - // console.log('file', file) - const formData = new FormData() - formData.append('file', file) - const res = await Api_server.Other.uploadFile(formData) - if (res && res.code == 200){ - const url = res?.url - url &&(o.src = url) - } - } else if (isBlobUrl) { // 视频和音频 - const res = await fetch(o.src) - const blob = await res.blob() - const fileName = o.type=='video'? Date.now() + '.mp4':Date.now() + '.mp3' - const file = commUtils.blobToFile(blob, fileName) - // o.src = fileName - // console.log('file', file) - const formData = new FormData() - formData.append('file', file) - const ress = await Api_server.Other.uploadFile(formData) - if (ress && ress.code == 200){ - const url = ress?.url + let onLineUrl = '' // 线上地址 + if (!!o.zipPath) onLineUrl = this.pptMedia[o.zipPath] || '' // 是否已上传过 + if (onLineUrl) o.src = onLineUrl // 已存在线上地址直接赋值 + else { // 不存在重新上传 + if (isBase64) { // 相同资源处理 + const url = await this.getOnlineFileUrl(o.src) + url && o.zipPath && (this.pptMedia[o.zipPath] = url) // 缓存 + } else if (isBlobUrl) { // 视频和音频 + const res = await fetch(o.src) + const blob = await res.blob() + const url = await this.getOnlineFileUrl(blob, o.type=='video'?'mp4':'mp3') + URL.revokeObjectURL(o.src) // 释放内存 url &&(o.src = url) + url && o.zipPath && (this.pptMedia[o.zipPath] = url) // 缓存 } } } - + // 处理元素为shape 可能存在背景图等 + const isBg = o?.gradient?.type == 'image' && !!o?.gradient?.image + if (isBg) { + const {src, zipPath} = o.gradient.image || {} + let onLineUrl = '' // 线上地址 + if (!!zipPath) onLineUrl = this.pptMedia[zipPath] || '' // 是否已上传过 + if (onLineUrl) o.gradient.image.src = onLineUrl // 已存在线上地址直接赋值 + else { // 重新上传 + const url = await this.getOnlineFileUrl(src) + o.gradient.image.src = url + url && zipPath && (this.pptMedia[zipPath] = url) // 缓存 + } + } + if (o?.background?.image) await this.toRousrceUrl(o.background.image) - // if (o?.elements) o.elements.forEach(async o => {await this.toRousrceUrl(o)}) - if(o?.elements){ - for (let element of o.elements) { - await this.toRousrceUrl(element); - } - } + if(o?.elements){ + for (let element of o.elements) { + await this.toRousrceUrl(element); + } + } }, async createAIPPTByFile(file,fileShowName) { this.pgDialog.visible = true this.pgDialog.pg.percentage = 0 + this.pptMedia = {} // 清空媒体数据 const resPptJson = await PPTXFileToJson(file).catch(() => { ElMessageBox.alert('PPT文件转换失败!请点击素材右侧...下载文件后打开另存为PPTX文件格式再进行导入!') this.pgDialog.visible = false -- 2.44.0.windows.1