es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo subir archivos grandes en Flutter web?

Ya hay un hilo excelente acerca de cómo seleccionar archivos: Artículo

Si uso file_picker, termino con List<PlatformFile>? files.
Pasé withReadStream: true al método pickFiles para obtener un stream.
Aquí está mi código hasta ahora:

List<PlatformFile>? files = fileUploadView.result?.files;
for (PlatformFile file in files!) {


//-----agregar archivo seleccionado con solicitud
request.files.add(http.MultipartFile(
    "Su nombre de parámetro en el lado del servidor",  file.readStream!,
    file.size,
    filename: file.name));
}

//-------Enviar solicitud
var resp = await request.send();

Pero si lo ejecuto, ocurre un error cada pocos segundos:

RangeError: Array buffer allocation failed
    at new ArrayBuffer (<anonymous>)
    at new Uint8Array (<anonymous>)
    at Function._create1 (http://localhost:54372/dart_sdk.js:32192:14)
    at Function.new (http://localhost:54372/dart_sdk.js:32155:49)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución al error RangeError en Flutter Web al cargar archivos

    Si te aparece el error RangeError: Array buffer allocation failed al cargar archivos usando Flutter Web, es posible que se deba al parámetro withReadStream: true que has pasado al método pickFiles del plugin file_picker en Flutter. Este parámetro hace que los archivos se lean como un flujo, lo que puede causar problemas con la asignación de búferes de matriz.

    Para resolver este problema, puedes utilizar el método readAsBytes() en lugar de readStream() para leer los archivos como bytes. Así es como puedes modificar tu código:

    List<platformfile>? files = fileUploadView.result?.files;
    
    for (PlatformFile file in files!) {
      // Leer el archivo como bytes
      List<int> fileBytes = await file.readAsBytes();
    
      // Añadir el archivo como archivo multiparte a la solicitud
      request.files.add(http.MultipartFile.fromBytes(
        "Nombre del parámetro en el servidor",
         fileBytes,
         filename: file.name
      ));
    }
    
    // Enviar la solicitud
    var resp = await request.send();
    

    Al leer los archivos como bytes y pasarlos al constructor MultipartFile.fromBytes(), puedes evitar el error RangeError y cargar los archivos correctamente.

Comments are closed.