code
DveloxSoft Bucket Guías de integración para desarrolladores

Subir archivos

Sube archivos a un contenedor usando un POST multipart simple para archivos menores a 500 MB, o cargas divididas en partes para archivos más grandes. Ambos métodos requieren un slug de contenedor válido y autenticación.

Cuándo usar cada método

Carga simple

Archivos menores de 500 MB. Un POST multipart, el servidor almacena el archivo directamente.

Carga dividida

Archivos de 500 MB o más. Divididos en partes de 10 MB. El frontend envía lotes de hasta 5 partes por solicitud.

Carga simple

Envía una solicitud multipart/form-data a POST /files/:containerSlug/*path. El servidor guarda el archivo en la ruta solicitada.

typescript
const formData = new FormData();
formData.append('file', file);

const response = await fetch(
  `https://bucket.dveloxsoft.com/api/files/${containerSlug}/${encodeURIComponent(path)}`,
  {
    method: 'POST',
    headers: {
      'Authorization': 'ApiKey <api_key>'
    },
    body: formData
  }
);

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.message || 'Upload failed');
}

const result = await response.json();
console.log('Uploaded to:', result.path, result.size, 'bytes');

Carga dividida

Para archivos grandes, genera un fileId estable, divide el archivo en partes de 10 MB y envíalas en lotes a POST /files/:containerSlug/chunked. El servidor ensambla el archivo una vez que lleguen todas las partes.

typescript
const CHUNK_SIZE = 10 * 1024 * 1024; // 10 MB
const fileId = crypto.randomUUID();
const totalChunks = Math.ceil(file.size / CHUNK_SIZE);

for (let i = 0; i < totalChunks; i += 5) {
  const batchIndices: number[] = [];
  const batchChunks: Blob[] = [];

  for (let j = i; j < Math.min(i + 5, totalChunks); j++) {
    const start = j * CHUNK_SIZE;
    const end = Math.min(start + CHUNK_SIZE, file.size);
    batchIndices.push(j);
    batchChunks.push(file.slice(start, end));
  }

  const formData = new FormData();
  batchChunks.forEach((chunk, idx) => {
    formData.append('files', chunk, `${fileId}-${batchIndices[idx]}`);
  });
  formData.append('fileId', fileId);
  formData.append('totalChunks', String(totalChunks));
  formData.append('fileName', file.name);
  formData.append('filePath', path);
  formData.append('chunkIndices', batchIndices.join(','));

  const response = await fetch(
    `https://bucket.dveloxsoft.com/api/files/${containerSlug}/chunked`,
    {
      method: 'POST',
      headers: {
        'Authorization': 'ApiKey <api_key>'
      },
      body: formData
    }
  );

  const data = await response.json();
  console.log('Chunk batch progress:', data);
}

Seguimiento de progreso con eventos

Usa la API Fetch con reportProgress: true para recibir eventos de progreso de carga. Mapea los eventos de progreso a un porcentaje y los eventos de respuesta al resultado final.

typescript
const response = await fetch(
  `https://bucket.dveloxsoft.com/api/files/${containerSlug}/${path}`,
  {
    method: 'POST',
    headers: {
      'Authorization': 'ApiKey <api_key>'
    },
    body: formData,
    signal: AbortSignal.timeout(30000)
  }
);

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.message || 'Upload failed');
}

const result = await response.json();
console.log('Upload complete:', result);