diff --git a/src/common/model/preference/model/PreviewEngine.ts b/src/common/model/preference/model/PreviewEngine.ts index bde3771..85a7b50 100644 --- a/src/common/model/preference/model/PreviewEngine.ts +++ b/src/common/model/preference/model/PreviewEngine.ts @@ -10,6 +10,7 @@ export default class PreviewEngine extends Base { * 此预览引擎的url * {originUrl} 文件原始的url地址。eg: https://tank.eyeblue.cn/api/alien/download/2a0ceee1-744c-4c82-4215-69c382597a50/abstract-free-photo-2210x1473.jpg * {url} 对于公有文件publicUrl=originUrl,对于私有文件publicUrl是originUrl带上downloadToken。 eg: https://tank.eyeblue.cn/api/alien/download/2a0ceee1-744c-4c82-4215-69c382597a50/abstract-free-photo-2210x1473.jpg?downloadTokenUuid=6bdba52f-af6b-49ae-5a5d-fd80bfb01d3b + * {b64Url} 文件原始地址 */ url: string = ""; diff --git a/src/pages/widget/previewer/PreviewerHelper.ts b/src/pages/widget/previewer/PreviewerHelper.ts index 60aeb7a..b4db211 100644 --- a/src/pages/widget/previewer/PreviewerHelper.ts +++ b/src/pages/widget/previewer/PreviewerHelper.ts @@ -11,6 +11,26 @@ import DownloadToken from "../../../common/model/download/token/DownloadToken"; * 文件预览帮助器 */ export default class PreviewerHelper { + + static b64EncodeUnicode(str: string) { + // first we use encodeURIComponent to get percent-encoded UTF-8, + // then we convert the percent encodings into raw bytes which + // can be fed into btoa. + return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, + // function toSolidBytes(match, p1) { + (match, p1) => { + // console.debug('match: ' + match); + return String.fromCharCode(("0x" + p1) as any); + })); + } + + static b64DecodeUnicode(str: string) { + // Going backwards: from bytestream, to percent-encoding, to original string. + return decodeURIComponent(atob(str).split('').map(function (c) { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); + } + /** * 准备好一个文件url */ @@ -76,8 +96,9 @@ export default class PreviewerHelper { const engine: PreviewEngine = previewEngine; - if(previewUrl) { + if (previewUrl) { targetUrl = targetUrl.replace("{originUrl}", previewUrl); + targetUrl = targetUrl.replace("{b64Url}", previewUrl); targetUrl = targetUrl.replace("{url}", previewUrl); if (engine.previewInSite) { BrowserPreviewer.show(fileName, targetUrl, matter.size); @@ -85,12 +106,12 @@ export default class PreviewerHelper { window.open(targetUrl); } } else { - const needToken = matter.privacy && targetUrl.indexOf("{url}") !== -1; + const needToken = matter.privacy && (targetUrl.indexOf("{url}") !== -1||targetUrl.indexOf("{b64Url}") !== -1) PreviewerHelper.prepareMatterUrl(matter, needToken, function (url) { targetUrl = targetUrl.replace("{originUrl}", matter.getPreviewUrl()); + targetUrl = targetUrl.replace("{b64Url}", encodeURIComponent(PreviewerHelper.b64EncodeUnicode(url))); targetUrl = targetUrl.replace("{url}", encodeURIComponent(url)); - if (engine.previewInSite) { BrowserPreviewer.show(fileName, targetUrl, matter.size); } else {