Compare commits

..

No commits in common. "088bd6ffaf23d9d10c5b958a36d12c168005b762" and "2bf268cbef0672eadd7fe2cbae4a87ae54b1b910" have entirely different histories.

View file

@ -48,46 +48,39 @@ export const SettingsPage: React.FC = () => {
}, [userId]); }, [userId]);
// Обработка загрузки файла // Обработка загрузки файла
const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => { const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0]; const file = e.target.files?.[0];
if (!file) return; if (!file) return;
setUploading(true); setUploading(true);
setError(null); setError(null);
// Создаем стандартный объект FormData // Создаем FormData строго по спецификации
const formData = new FormData(); const formData = new FormData();
// Ключ "image" соответствует вашему OpenAPI
formData.append("image", file); formData.append("image", file);
try { try {
// Используем нативный fetch вместо сгенерированного postMediaUpload // Используем fetch напрямую или убеждаемся, что клиент принимает FormData
const response = await fetch("/api/v1/media/upload", { const res = await postMediaUpload({
method: "POST", // @ts-ignore - обходим строгую типизацию тела, если она ожидает объект
body: formData, body: formData,
headers: { headers: {
// Важно: НЕ УКАЗЫВАЕМ Content-Type. // УДАЛЯЕМ Content-Type вообще.
// Браузер сам добавит multipart/form-data и сгенерирует boundary. // Если оставить undefined, некоторые клиенты могут подставить 'application/json'.
"X-XSRF-TOKEN": xsrfToken || "", // Нам нужно, чтобы заголовок отсутствовал в объекте headers,
// тогда fetch сам выставит multipart/form-data с boundary.
"X-XSRF-TOKEN": xsrfToken,
}, },
}); });
if (!response.ok) { if (res.data && res.data.id) {
const errorText = await response.text(); setAvatarId(res.data.id);
throw new Error(errorText || "Upload failed"); setAvatarUrl(res.data.image_path ?? null);
}
// Ответ должен соответствовать схеме Image.yaml
const data = await response.json();
if (data && data.id) {
setAvatarId(data.id);
setAvatarUrl(data.image_path ?? null);
setSuccess("Image uploaded!"); setSuccess("Image uploaded!");
} }
} catch (err: any) { } catch (err: any) {
console.error("Upload error:", err); console.error("Upload error:", err);
setError(err.message || "Failed to upload image"); setError("Upload failed. Check if the file is an image.");
} finally { } finally {
setUploading(false); setUploading(false);
} }