122 lines
3.4 KiB
TypeScript
122 lines
3.4 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
||
import { uploadFileToS3, deleteFileFromS3, extractKeyFromUrl } from '@/lib/s3';
|
||
|
||
export async function POST(request: NextRequest) {
|
||
console.log('API Upload: Получен запрос POST');
|
||
try {
|
||
const formData = await request.formData();
|
||
const file = formData.get('file') as File;
|
||
const folder = formData.get('folder') as string || 'uploads';
|
||
const oldUrl = formData.get('oldUrl') as string;
|
||
|
||
if (!file) {
|
||
return NextResponse.json(
|
||
{ error: 'Файл не найден' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
// Проверяем размер файла (максимум 10MB)
|
||
const maxSize = 10 * 1024 * 1024; // 10MB
|
||
if (file.size > maxSize) {
|
||
return NextResponse.json(
|
||
{ error: 'Файл слишком большой. Максимальный размер: 10MB' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
// Проверяем тип файла
|
||
const allowedTypes = [
|
||
'image/jpeg',
|
||
'image/png',
|
||
'image/gif',
|
||
'image/webp',
|
||
'image/svg+xml',
|
||
'application/pdf',
|
||
'application/msword',
|
||
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||
'text/plain', // Для тестирования S3Status
|
||
];
|
||
|
||
if (!allowedTypes.includes(file.type)) {
|
||
return NextResponse.json(
|
||
{ error: 'Неподдерживаемый тип файла' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
// Если есть старый файл, удаляем его
|
||
if (oldUrl) {
|
||
const oldKey = extractKeyFromUrl(oldUrl);
|
||
if (oldKey) {
|
||
try {
|
||
await deleteFileFromS3(oldKey);
|
||
} catch (error) {
|
||
console.error('Ошибка при удалении старого файла:', error);
|
||
// Не прерываем процесс, если не удалось удалить старый файл
|
||
}
|
||
}
|
||
}
|
||
|
||
// Конвертируем файл в Buffer
|
||
const bytes = await file.arrayBuffer();
|
||
const buffer = Buffer.from(bytes);
|
||
|
||
// Загружаем файл в S3
|
||
const result = await uploadFileToS3(
|
||
buffer,
|
||
file.type,
|
||
folder,
|
||
file.name
|
||
);
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: result,
|
||
message: 'Файл успешно загружен'
|
||
});
|
||
|
||
} catch (error) {
|
||
console.error('Ошибка при загрузке файла:', error);
|
||
return NextResponse.json(
|
||
{ error: 'Ошибка при загрузке файла' },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}
|
||
|
||
export async function DELETE(request: NextRequest) {
|
||
try {
|
||
const { searchParams } = new URL(request.url);
|
||
const url = searchParams.get('url');
|
||
|
||
if (!url) {
|
||
return NextResponse.json(
|
||
{ error: 'URL файла не указан' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
const key = extractKeyFromUrl(url);
|
||
if (!key) {
|
||
return NextResponse.json(
|
||
{ error: 'Некорректный URL файла' },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
await deleteFileFromS3(key);
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
message: 'Файл успешно удален'
|
||
});
|
||
|
||
} catch (error) {
|
||
console.error('Ошибка при удалении файла:', error);
|
||
return NextResponse.json(
|
||
{ error: 'Ошибка при удалении файла' },
|
||
{ status: 500 }
|
||
);
|
||
}
|
||
}
|