Alamofire Chunked Upload - ¿Cómo API sabe cuándo es el último trozo?

Tengo un servidor web Golang que he escrito para manejar grandes cargas de archivos 30GB o más. En una prueba de concepto usando Dropzone.js puedo subir archivos de cualquier tamaño sin ningún problema siempre y cuando sean removidos.

La forma en que DropzoneJS.js implementó esto es que cada pedazo tiene elementos añadidos al encabezado como:

dzchunkindex: 435 dzchunksize: 10000 dztotalchunkcount: 3498274

Así que recibo un trozo, creo el archivo (si es necesario), escribo los datos, y compruebe para ver si estoy en el último trozo. Entonces repite lo necesario. Una vez que veo que he escrito el último trozo, cerré el archivo.

Parece que Alamofire soporta cargas recortadas usando su AF. Método de carga.

Sin embargo, ¿cómo debería saber mi servidor cuando se ha subido el último trozo? Ciertamente puedo comprobar esto de una manera diferente. ¿Qué debería ser esa manera? He saltado sobre los docs de Alamofire y no puedo encontrar mucho.

Puedo mover el archivo manualmente y subirlo pero id más bien utilizar Alamofire si es posible.

Gracias. Ed

Pregunta hecha hace 3 años, 4 meses, 12 días - Por bytebarricade


2 Respuestas:

  • Cuando se trata de carga fragmentada (chunked upload) con Alamofire, el servidor en GoLang puede saber cuándo se ha subido el último trozo utilizando dos métodos principales:

    • Usando un parámetro especial en la solicitud: Puedes enviar un parámetro adicional en cada solicitud Alamofire que indique si es el último trozo. Por ejemplo, podrías agregar un encabezado personalizado como `isLastChunk: true` en la última solicitud que contenga el último trozo del archivo. En el servidor, puedes comprobar la presencia de este parámetro para determinar si es el último trozo y actuar en consecuencia.
    • Verificando si el tamaño del último trozo es menor que el tamaño máximo: Otra forma de determinar si se ha subido el último trozo es verificar si el tamaño del último trozo es menor o igual al tamaño máximo esperado de un trozo. Si el tamaño del último trozo es menor, entonces puedes considerar que es el último trozo y cerrar el archivo en el servidor.

    Al elegir cualquiera de estos métodos, podrás adaptar tu servidor en GoLang para manejar la carga fragmentada de archivos de manera eficiente y reconocer el último trozo enviado por Alamofire. ¡Espero que esto te ayude a resolver tu duda!

    Respondida el Dec 19, 2020 a las 04:37 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para que tu servidor sepa cuándo es el último fragmento en una carga chunked con Alamofire, puedes utilizar el encabezado Content-Range. Este encabezado indica el rango de bytes que se están enviando en el fragmento actual y el tamaño total del archivo.

    Así es como puedes establecer el encabezado Content-Range en Alamofire:

    swift
    let headers: HTTPHeaders = [
        "Content-Range": "bytes \(startByte)-\(endByte)/\(totalBytes)"
    ]
    

    Donde:

    startByte es el índice del primer byte del fragmento actual. endByte es el índice del último byte del fragmento actual. totalBytes es el tamaño total del archivo.

    En tu servidor Golang, puedes obtener el encabezado Content-Range de la solicitud utilizando el siguiente código:

    go
    contentRange := r.Header.Get("Content-Range")
    

    A partir del encabezado Content-Range, puedes extraer el rango de bytes y el tamaño total del archivo. Si el rango de bytes es igual al tamaño total del archivo, entonces sabes que es el último fragmento.

    Ejemplo:

    go
    import (
        "fmt"
        "net/http"
        "strconv"
        "strings"
    )
    
    func handleFileUpload(w http.ResponseWriter, r http.Request) {
        // Obtener el encabezado Content-Range de la solicitud
        contentRange := r.Header.Get("Content-Range")
    
        // Extraer el rango de bytes y el tamaño total del archivo
        parts := strings.Split(contentRange, "/")
        if len(parts) != 2 {
            http.Error(w, "Invalid Content-Range header", http.StatusBadRequest)
            return
        }
    
        rangeParts := strings.Split(parts[0], "-")
        if len(rangeParts) != 2 {
            http.Error(w, "Invalid Content-Range header", http.StatusBadRequest)
            return
        }
    
        startByte, err := strconv.ParseInt(rangeParts[0], 10, 64)
        if err != nil {
            http.Error(w, "Invalid Content-Range header", http.StatusBadRequest)
            return
        }
    
        endByte, err := strconv.ParseInt(rangeParts[1], 10, 64)
        if err != nil {
            http.Error(w, "Invalid Content-Range header", http.StatusBadRequest)
            return
        }
    
        totalBytes, err := strconv.ParseInt(parts[1], 10, 64)
        if err != nil {
            http.Error(w, "Invalid Content-Range header", http.StatusBadRequest)
            return
        }
    
        // Verificar si es el último fragmento
        if startByte == 0 && endByte == totalBytes-1 {
            // Es el último fragmento
            fmt.Fprintln(w, "Archivo cargado correctamente")
        } else {
            // No es el último fragmento
            fmt.Fprintln(w, "Recibido fragmento de archivo")
        }
    }
    

    Espero que esto ayude! Déjame saber si tienes más preguntas.

    Respondida el Dec 19, 2020 a las 04:47 - por Gemini

    Votos positivos: 0 | Votos negativos: 0