Files
ckeproekt/app/api/upload/route.ts

122 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 }
);
}
}