r2drive
Version:
A modern desktop file manager for Cloudflare R2 storage with intuitive drag & drop interface
98 lines (86 loc) • 2.84 kB
text/typescript
import { ListObjectsV2Command } from '@aws-sdk/client-s3';
import { getR2Client, getBucketName, hasR2Config } from '@/app/lib/r2-server';
import { NextRequest, NextResponse } from 'next/server';
export const dynamic = 'force-dynamic';
export async function GET(request: NextRequest) {
try {
// Verificar que hay configuración antes de intentar conectar
if (!hasR2Config()) {
return NextResponse.json(
{ success: false, error: 'No R2 configuration found' },
{ status: 500 }
);
}
const r2Client = getR2Client();
const bucketName = getBucketName();
const searchParams = request.nextUrl.searchParams;
const prefix = searchParams.get('prefix') || '';
const delimiter = '/'; // Usar delimitador para simular navegación por carpetas
const command = new ListObjectsV2Command({
Bucket: bucketName,
Prefix: prefix,
Delimiter: delimiter,
MaxKeys: 1000,
});
const response = await r2Client.send(command);
// Procesamos los resultados para tener una estructura más amigable
const result = {
success: true,
prefix: prefix,
files: [] as Array<{
key: string;
name: string;
size: number;
lastModified: Date | undefined;
isFolder: boolean;
}>,
folders: [] as Array<{
prefix: string;
name: string;
}>,
parentFolder: prefix.includes('/')
? prefix.split('/').slice(0, -1).join('/')
: '',
};
// Procesar archivos
if (response.Contents) {
for (const item of response.Contents) {
// Ignorar el archivo que representa al directorio actual
if (item.Key === prefix) continue;
const name = item.Key?.substring(prefix.length) || '';
// Solo incluir archivos directos (no los que están en subcarpetas)
if (!name.includes('/')) {
result.files.push({
key: item.Key || '',
name,
size: item.Size || 0,
lastModified: item.LastModified,
isFolder: false,
});
}
}
}
// Procesar carpetas (CommonPrefixes)
if (response.CommonPrefixes) {
for (const prefix of response.CommonPrefixes) {
const folderPrefix = prefix.Prefix || '';
const folderName = folderPrefix.split('/').filter(Boolean).pop() || '';
result.folders.push({
prefix: folderPrefix,
name: folderName,
});
}
}
return NextResponse.json(result);
} catch (error) {
console.error('Error al listar objetos del bucket:', error);
return NextResponse.json(
{
success: false,
error: 'Error al listar objetos del bucket',
details: error
},
{ status: 500 }
);
}
}