Исправление кодировки не-английских букв.

This commit is contained in:
justuser-31 2026-02-04 14:51:18 +03:00
parent 3ba1ccf8e8
commit d0edd7d459

View File

@ -3,7 +3,7 @@ import os
import sqlite3 import sqlite3
from datetime import datetime from datetime import datetime
from http.server import BaseHTTPRequestHandler from http.server import BaseHTTPRequestHandler
from urllib.parse import parse_qs, urlparse from urllib.parse import parse_qs, unquote, urlparse
import database import database
from config import get_storage_root, load_config from config import get_storage_root, load_config
@ -289,14 +289,19 @@ class FileServerHandler(BaseHTTPRequestHandler):
self.send_redirect("/files") self.send_redirect("/files")
def handle_file_download(self, username, filename): def handle_file_download(self, username, filename):
# Decode URL-encoded filename
# For example when we have not default symbols: %D1%80%D0%B8%D0%BD%D0%B3%D1%82%D0%BE%D0%BD.mp3
decoded_filename = unquote(filename)
user_dir = os.path.join(get_storage_root(), username) user_dir = os.path.join(get_storage_root(), username)
filepath = os.path.join(user_dir, filename) filepath = os.path.join(user_dir, decoded_filename)
print(filepath)
if not os.path.exists(filepath) or not os.path.isfile(filepath): if not os.path.exists(filepath) or not os.path.isfile(filepath):
self.send_html("<h1>File not found</h1>", 404) self.send_html("<h1>File not found</h1>", 404)
return return
mime_type, _ = mimetypes.guess_type(filename) mime_type, _ = mimetypes.guess_type(decoded_filename)
if not mime_type: if not mime_type:
mime_type = "application/octet-stream" mime_type = "application/octet-stream"
@ -306,9 +311,9 @@ class FileServerHandler(BaseHTTPRequestHandler):
if mime_type.startswith(("image/", "video/", "audio/")): if mime_type.startswith(("image/", "video/", "audio/")):
disposition = "inline" disposition = "inline"
else: else:
disposition = f'attachment; filename="{filename}"' disposition = f"attachment; filename*=UTF-8''{quote(decoded_filename)}"
else: else:
disposition = f'attachment; filename="{filename}"' disposition = f"attachment; filename*=UTF-8''{quote(decoded_filename)}"
self.send_response(200) self.send_response(200)
self.send_header("Content-Type", mime_type) self.send_header("Content-Type", mime_type)