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
- FileServer
- MIME Form data
- WebDAV implementation para InterSystems
Comments
Los artículos con la etiqueta "Mejores prácticas" incluyen recomendaciones sobre cómo desarrollar, probar, implementar y administrar mejor las soluciones de InterSystems.