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
- FileServer
- MIME Form data
- WebDAV implementation para InterSystems