Compare commits
No commits in common. "088bd6ffaf23d9d10c5b958a36d12c168005b762" and "2bf268cbef0672eadd7fe2cbae4a87ae54b1b910" have entirely different histories.
088bd6ffaf
...
2bf268cbef
1 changed files with 15 additions and 22 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue