fix: OnlyOffice/Preview zeigt immer aktuelle Version (kein Cache)

Drei Cache-Ebenen gefixt:
- Vue Router: :key=fullPath erzwingt Komponenten-Neuaufbau bei
  jeder Navigation (kein Wiederverwenden alter Instanzen)
- Frontend: Cache-Bust Parameter an Preview + OnlyOffice API-Calls
- Backend: No-Cache Headers (Cache-Control, Pragma) auf Preview-Endpunkt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Hacker 2026-04-11 22:50:33 +02:00
parent 916971fc1b
commit 5f79ebe9b0
3 changed files with 11 additions and 3 deletions

View File

@ -16,6 +16,13 @@ from app.models.settings import AppSettings
@api_bp.route('/files/<int:file_id>/preview', methods=['GET']) @api_bp.route('/files/<int:file_id>/preview', methods=['GET'])
@token_required @token_required
def preview_file(file_id): def preview_file(file_id):
from flask import after_this_request
@after_this_request
def add_no_cache(response):
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
response.headers['Pragma'] = 'no-cache'
return response
user = request.current_user user = request.current_user
f, err = _get_file_or_403(file_id, user, 'read') f, err = _get_file_or_403(file_id, user, 'read')
if err: if err:

View File

@ -67,7 +67,7 @@
</aside> </aside>
<main class="main-content"> <main class="main-content">
<router-view /> <router-view :key="$route.fullPath" />
</main> </main>
</div> </div>
</template> </template>

View File

@ -104,6 +104,7 @@ const auth = useAuthStore()
const toast = useToast() const toast = useToast()
const fileId = route.params.fileId const fileId = route.params.fileId
const cacheBust = Date.now()
const fileName = ref('') const fileName = ref('')
const previewType = ref('') const previewType = ref('')
const previewUrl = ref('') const previewUrl = ref('')
@ -135,12 +136,12 @@ async function loadPreview() {
loading.value = true loading.value = true
try { try {
// For Office files, try OnlyOffice first // For Office files, try OnlyOffice first
const previewRes = await apiClient.get(`/files/${fileId}/preview`) const previewRes = await apiClient.get(`/files/${fileId}/preview?_=${cacheBust}`)
fileName.value = previewRes.data.name || '' fileName.value = previewRes.data.name || ''
if (isOfficeFile(fileName.value)) { if (isOfficeFile(fileName.value)) {
try { try {
const ooRes = await apiClient.get(`/files/${fileId}/onlyoffice-config`) const ooRes = await apiClient.get(`/files/${fileId}/onlyoffice-config?_=${cacheBust}`)
if (ooRes.data.available) { if (ooRes.data.available) {
onlyOfficeMode.value = true onlyOfficeMode.value = true
loading.value = false loading.value = false