Artículo
· 14 dic, 2022 Lectura de 2 min

Cómo subir y descargar archivos a través de HTTP

En este artículo, mostraré cómo subir y descargar archivos vía http desde los productos de InterSystems.

A menudo desde la comunidad surgen preguntas sobre como trabajar con archivos a través de http y normalmente os emplazamos a revisar el proyecto FileServer, que muestra la subida/descarga de archivos. Pero me gustaría hablar un poco más de cómo podemos enviar y recibir archivos desde los productos de InterSystems.

Cómo descargar un archivo

Si tenéis un archivo en un sistema de archivos y conocéis su ruta, podéis enviarlo vía REST o en el contexto de CSP llamando a este método:

ClassMethod serve(name As %String) As %Status
{
    #dim sc As %Status = $$$OK
    #dim %response As %CSP.Response
    kill %request.Data
    set %request.Data("STREAMOID",1)= ##class(%CSP.StreamServer).Encrypt(##class(%CSP.StreamServer).GetOidForFile(name))
    if ##class(%CSP.StreamServer).OnPreHTTP() {
        set %response.Headers("Content-Disposition")="attachment; filename*=UTF-8''" _ ##class(%CSP.Page).EscapeURL(##class(%File).GetFilename(name), "UTF8")
        set sc = ##class(%CSP.StreamServer).OnPage()
    }

    quit sc
}

Si tenéis un stream en lugar de un nombre de fichero, podéis reemplazar

##class(%CSP.StreamServer).GetOidForFile(name)

por

stream.%Oid()

¡Y eso es todo!

En un navegador, el usuario verá un cuadro de diálogo de descarga.

Cómo subir un archivo

En el lado del cliente (asumiendo el uso de JS/HTML), cread un input de tipo file:

<input id="myFile" type="file">

y escribid un código JavaScript para enviar solicitudes POST al servidor (depende del framework):

function FileLoad(){
        var formData = new FormData();
        formData.append("file", document.getElementById("myFile").files[0]);

        var xhr = new XMLHttpRequest();

        // Upload data to server
        xhr.open("POST", "/rest/path", true);

        xhr.send(formData);
        
        xhr.onload = function(e) {
            if (this.status == 200) {
                // everything is OK
            } else {
                alert(this.status + ' ' + this.statusText);
            }
        };
}

En el lado del servidor, podéis obtener el stream de una forma tan sencilla como la siguiente

#dim %request As %CSP.Request
#dim stream As %CSP.BinaryStream
set stream = %request.GetMimeData("file")

Después, podéis guardar este stream a un archvo, en una base de datos o simplemente procesarlo sin guardarlo.

Enlaces de interéss

Comentarios (1)1
Inicie sesión o regístrese para continuar