I bring you a query about how to achieve, by means of an HTTP procedure, that Genexus downloads 2 different files for me.
TOOL: GeneXus 17u2
REQUIREMENT: Download 2 independent files through HTTP protocol, since they are mutually exclusive.
PROBLEM: The procedure that executes the download http protocol works correctly, but it is executed only once, not downloading the second file. Individually downloaded files have been verified to work properly.
POSSIBLE SOLUTIONS (DID NOT WORK):
- Create an individual http procedure for each file to download.
- Execute through 2 functions (Sub) the same procedure using different variables.
- Chrome is used as the default browser. The policy of allowing more than one file to be downloaded from the same source cannot be changed because it is controlled by the dept. of security.
- Another browser (Edge) was used, with the same results.
SAMPLE CODE:
Sub 'U_BotonClic'
//Boton para ejecutar el procedimiento de transformacion y descarga de archivos
do 'Convertir'
endsub
sub 'convertir'
//Metodo para escribir un archivo de texto (ASCII) luego de utilizar datos cargados a un archivo blob; funciona correctamente
if (&validacion = 1)
do 'registroIncluido'
else
do 'registroExcluido'
endif
do 'descargarArchivoIncluido' //Metodo que invoca al procedimiento de archivos incluidos
do 'descargarArchivoExcluido' //Metodo que invoca al procedimiento de archivos excluidos
endsub
sub 'registroIncluido'
&FileNameI = "ARCHIVOINCLUIDO.ASC" //Nombre que tendra el archivo de texto
&FileNameIPath = Directory.TemporaryFilesPath + &FileNameI //El archivo se guardara en el directorio de archivos temporales de windows
&I = DFWOPEN(&FileNameIPath, "", "", 1, "")
&I = DFWPTXT(&RegistrosI)
&I = DFWNEXT()
&I = DWFCLOSE()
endsub
sub 'registroExcluido'
&FileNameE = "ARCHIVOEXCLUIDO.ASC" //Nombre que tendra el archivo de texto
&FileNameEPath = Directory.TemporaryFilesPath + &FileNameE //El archivo se guardara en el directorio de archivos temporales de windows
&I = DFWOPEN(&FileNameEPath, "", "", 1, "")
&I = DFWPTXT(&RegistrosE)
&I = DFWNEXT()
&I = DWFCLOSE()
endsub
sub 'descargarArchivoIncluido'
Descarga.Call(&FileNameI, &FileNameIPath) //Invocar el procedimiento http protocol para descargar el archivo. El mismo se guardara en la carpeta de descargas de windows
endsub
sub 'descargarArchivoExcluido'
Descarga.Call(&FileNameE, &FileNameEPath) //Invocar el procedimiento http protocol para descargar el archivo. El mismo se guardara en la carpeta de descargas de windows
endsub
//PROCEDIMIENTO DE HTTP PROTOCOL
//ATRIBUTOS:
//MAIN PROGRAM = TRUE
//CALL PROTOCOL = HTTP
RULES:
PARM(IN: &FILENAME, &FILENAMEPATH);
SOURCE:
&contentType = 'application/x-download'
&httpResponse.AddHeader('Content-Type', &contentType)
&httpResponse.AddHeader('Content-Disposition', !"attachment;filename="+&FILENAME) //Nombre que le asigna al archivo a ser descargado
&httpResponse.AddFile(&FILENAMEPATH) //Ruta donde esta alojado el documento y lo descarga a la carpeta de descargas de windows
After much trial and error I realized that because of the way a procedure is defined with the attributes:
MAIN PROGRAM = TRUE
CALL PROTOCOL = HTTP
This will only be called once when all the events of the web panel finish executing. Unfortunately it means that it cannot be invoked on demand, so I had to modify the source code to only return a single file.
It's not exactly what I wanted to achieve, but it's close enough to the requirement to be usable.