perf: 优化pdf浏览方式

This commit is contained in:
kuaifan 2022-06-23 14:37:54 +08:00
parent d0bc85346e
commit 045d585df4
9 changed files with 73 additions and 56 deletions

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\File;
use App\Module\Base; use App\Module\Base;
use App\Module\Ihttp; use App\Module\Ihttp;
use App\Module\RandomColor; use App\Module\RandomColor;
@ -276,6 +277,40 @@ class IndexController extends InvokeController
]; ];
} }
/**
* 预览文件
* @return array|mixed
*/
public function online__preview()
{
$key = trim(Request::input('key'));
//
$data = parse_url($key);
$path = Arr::get($data, 'path');
$file = public_path($path);
//
if (file_exists($file)) {
parse_str($data['query'], $query);
$name = Arr::get($query, 'name');
$ext = strtolower(Arr::get($query, 'ext'));
if ($ext === 'pdf') {
return response()->download($file, $name, [], 'inline');
}
//
if (in_array($ext, File::localExt)) {
$url = Base::fillUrl($path);
} else {
$url = 'http://' . env('APP_IPPR') . '.3/' . $path;
}
$url = Base::urlAddparameter($url, [
'fullfilename' => $name
]);
$toUrl = Base::fillUrl("fileview/onlinePreview?url=" . urlencode(base64_encode($url)));
return Redirect::to($toUrl, 301);
}
return abort(404);
}
/** /**
* 设置语言和皮肤 * 设置语言和皮肤
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View

View File

@ -455,21 +455,14 @@ class File extends AbstractModel
else else
{ {
// 其他预览 // 其他预览
if (in_array($fileExt, File::localExt)) { $name = Base::rightDelete($fileName, ".{$fileExt}") . ".{$fileExt}";
$url = Base::fillUrl($filePath);
} else {
$url = 'http://' . env('APP_IPPR') . '.3/' . $filePath;
}
if ($fileExt != 'pdf') {
$fileDotExt = ".{$fileExt}";
$fullFileName = Base::rightDelete($fileName, $fileDotExt) . $fileDotExt;
$url = Base::urlAddparameter($url, [
'fullfilename' => $fullFileName
]);
}
$data['content'] = [ $data['content'] = [
'preview' => true, 'preview' => true,
'url' => base64_encode($url), 'name' => $name,
'key' => urlencode(Base::urlAddparameter($filePath, [
'name' => $name,
'ext' => $fileExt
])),
]; ];
$data['file_mode'] = 'preview'; $data['file_mode'] = 'preview';
} }

View File

@ -50,19 +50,12 @@ class FileContent extends AbstractModel
$fileExt = $array['ext']; $fileExt = $array['ext'];
$fileName = $array['name']; $fileName = $array['name'];
$filePath = $array['path']; $filePath = $array['path'];
if (in_array($fileExt, File::localExt)) { $name = Base::rightDelete($fileName, ".{$fileExt}") . ".{$fileExt}";
$url = Base::fillUrl($filePath); $key = urlencode(Base::urlAddparameter($filePath, [
} else { 'name' => $name,
$url = 'http://' . env('APP_IPPR') . '.3/' . $filePath; 'ext' => $fileExt
} ]));
if ($fileExt != 'pdf') { return Base::fillUrl("online/preview/{$name}?key={$key}");
$fileDotExt = ".{$fileExt}";
$fullFileName = Base::rightDelete($fileName, $fileDotExt) . $fileDotExt;
$url = Base::urlAddparameter($url, [
'fullfilename' => $fullFileName
]);
}
return Base::fillUrl("fileview/onlinePreview?url=" . urlencode(base64_encode($url)));
} }
/** /**

View File

@ -4,7 +4,7 @@
<Alert v-if="loadError" class="load-error" type="error" show-icon>{{$L('组件加载失败!')}}</Alert> <Alert v-if="loadError" class="load-error" type="error" show-icon>{{$L('组件加载失败!')}}</Alert>
<div :id="id" class="placeholder"></div> <div :id="id" class="placeholder"></div>
</template> </template>
<IFrame v-else class="preview-iframe" :src="previewUrl" @on-message="onMessage"/> <IFrame v-else class="preview-iframe" :src="previewUrl" @on-load="onFrameLoad"/>
<div v-if="loading" class="office-loading"><Loading/></div> <div v-if="loading" class="office-loading"><Loading/></div>
</div> </div>
</template> </template>
@ -187,12 +187,8 @@ export default {
}, },
methods: { methods: {
onMessage(data) { onFrameLoad() {
switch (data.action) { this.loading = false;
case 'ready':
this.loading = false;
break
}
}, },
getType(type) { getType(type) {

View File

@ -1,6 +1,6 @@
<template> <template>
<div v-if="ready" class="file-content"> <div v-if="ready" class="file-content">
<IFrame v-if="isPreview" class="preview-iframe" :src="previewUrl" @on-message="onMessage"/> <IFrame v-if="isPreview" class="preview-iframe" :src="previewUrl" @on-load="onFrameLoad"/>
<template v-else-if="contentDetail"> <template v-else-if="contentDetail">
<EPopover <EPopover
v-if="['word', 'excel', 'ppt'].includes(file.type)" v-if="['word', 'excel', 'ppt'].includes(file.type)"
@ -278,10 +278,10 @@ export default {
previewUrl() { previewUrl() {
if (this.isPreview) { if (this.isPreview) {
return $A.apiUrl("../fileview/onlinePreview?url=" + encodeURIComponent(this.contentDetail.url)) const {name, key} = this.contentDetail;
} else { return $A.apiUrl(`../online/preview/${name}?key=${key}`)
return '';
} }
return '';
}, },
}, },
@ -311,12 +311,8 @@ export default {
} }
}, },
onMessage(data) { onFrameLoad() {
switch (data.action) { this.loadPreview = false;
case 'ready':
this.loadPreview = false;
break
}
}, },
keySave(e) { keySave(e) {

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="file-preview"> <div class="file-preview">
<IFrame v-if="isPreview" class="preview-iframe" :src="previewUrl" @on-message="onMessage"/> <IFrame v-if="isPreview" class="preview-iframe" :src="previewUrl" @on-load="onFrameLoad"/>
<template v-else-if="contentDetail"> <template v-else-if="contentDetail">
<div v-show="headerShow && !['word', 'excel', 'ppt'].includes(file.type)" class="edit-header"> <div v-show="headerShow && !['word', 'excel', 'ppt'].includes(file.type)" class="edit-header">
<div class="header-title"> <div class="header-title">
@ -110,20 +110,16 @@ export default {
previewUrl() { previewUrl() {
if (this.isPreview) { if (this.isPreview) {
return $A.apiUrl("../fileview/onlinePreview?url=" + encodeURIComponent(this.contentDetail.url)) const {name, key} = this.contentDetail;
} else { return $A.apiUrl(`../online/preview/${name}?key=${key}`)
return '';
} }
return '';
}, },
}, },
methods: { methods: {
onMessage(data) { onFrameLoad() {
switch (data.action) { this.loadPreview = false;
case 'ready':
this.loadPreview = false;
break
}
}, },
getContent() { getContent() {

View File

@ -1,5 +1,5 @@
<template> <template>
<iframe v-if="src" ref="iframe" :src="src"></iframe> <iframe v-show="src" ref="iframe" :src="src"></iframe>
</template> </template>
<script> <script>
@ -13,14 +13,20 @@ export default {
}, },
mounted() { mounted() {
this.$refs.iframe.addEventListener('load', this.handleLoad)
window.addEventListener('message', this.handleMessage) window.addEventListener('message', this.handleMessage)
}, },
beforeDestroy() { beforeDestroy() {
this.$refs.iframe.removeEventListener('load', this.handleLoad)
window.removeEventListener('message', this.handleMessage) window.removeEventListener('message', this.handleMessage)
}, },
methods: { methods: {
handleLoad() {
this.$emit("on-load")
},
handleMessage({data, source}) { handleMessage({data, source}) {
if (source !== this.$refs.iframe?.contentWindow) { if (source !== this.$refs.iframe?.contentWindow) {
return; return;

View File

@ -132,7 +132,8 @@ export default {
}, },
previewUrl() { previewUrl() {
return $A.apiUrl("../fileview/onlinePreview?url=" + encodeURIComponent(this.msgDetail.content.url)) const {name, key} = this.msgDetail.content;
return $A.apiUrl(`../online/preview/${name}?key=${key}`)
} }
}, },
methods: { methods: {

View File

@ -119,7 +119,8 @@ export default {
}, },
previewUrl() { previewUrl() {
return $A.apiUrl("../fileview/onlinePreview?url=" + encodeURIComponent(this.fileDetail.content.url)) const {name, key} = this.fileDetail.content;
return $A.apiUrl(`../online/preview/${name}?key=${key}`)
} }
}, },
methods: { methods: {