Salvataggio e restituzione allegati senza l'utilizzo di Highway Imaging Control

In questo esempio, composto da una serie di script, viene descritto un metodo alternativo per la gestione degli allegati rispetto a quello più comunemente utilizzato che utilizza Highway Imaging Contol.

Sommariamente si tratta di fare uso di campi <INPUT type="file">, intercettare il file all'atto del salvataggio del documento e degli allegati;
Per fare uso del tag <INPUT type="file"> è necessario che il tag <FORM> contenga la proprietà enctype="multipart/form-data"
In fase di visualizzazione invece si tratta di individuare il file allegato e di fare richiesta remota al Server Web.

Esempio: di salvataggio allegato
Form di inserimento
<html>
 <head>
  <title>Inserimento/Modifica</title>
 </head>
 <body>
  <form action="%script%/a%curarc%/fput" method="post" enctype="multipart/form-data">
   <input name="allegato" type="file"><br>
   <input name="testo" type="text">
   <input type="submit" value="salva">
   <input name="tiporec.x" type="hidden" value="tabella">
  </form>
 </body>
</html>

In questa form l'utente - digitando mediante tastiera o mediante l'uso del pulsante Sfoglia (che viene inserito automaticamente dal browser a lato del campo <INPUT type="file">) oppure con le funzionalità di copia-incolla - inserirà nella casella di testo dal nome allegato un nome di file (uno solo!) completo di percorso ed estensione.
Alla pressione del pulsante salva vengono inviate le coppie chiave-valore allo script indicato nella action del tag form.

Form di salvataggio
dichiarata nell'ini dell'applicazione come put
<!-- controlla se la coppia chiave-valore 'tiporec.x' è vuota
manda un messaggio di errore ed esce -->
<!-- esegue una %NEWDOC% per salvare il documento -->
<!-- esegue una loop sulle coppie chiave-valore ricevute -->
%NUMBER%(empty,1)
%REPEAT%(1,%NUMTUPLES%)
 %NUMBER%(keylen,%STRLEN%(%TUPLEKEY%(%INDEX%)))
 <!-- le coppie chiave-valore la cui chiave termina con un .x
  non devono essere elaborate -->
 %IF%(%STRICMP%(%MID%(%TUPLEKEY%(%INDEX%),keylen-2,-1),".x")==0)
  %CONTINUE%
 %ENDIF%
 <!-- se la coppia chiave-valore corrente proviene da un type=file ... -->
 %IF%(%TUPLEFILE%(%INDEX%) > 0)
  %STRING%(tempfile,"")
  <!-- ... creare un file temporaneo -->
  %IF%(%GETTEMPFILENAME%(tempfile,"TMP") == 0)
   %WRITE%("Errore in %GETTEMPFILENAME%()")
   %RETURN%
  %ENDIF%
  <!-- scrive il contenuto del file ricevuto nel file temporaneo
   e verifica di avere scritto tutti i bytes ricevuti -->
  %IF%(%TUPLEWRITE%(%INDEX%,tempfile) != %TUPLEFILE%(%INDEX%))
   %WRITE%(%PARSE%("Errore di scrittura su %tempfile%","%"))
   %RETURN%
  %ENDIF%
  <!-- genera id numerico unico d'archivio -->
  %NUMBER%(result,%ATTACHADD%(%TUPLEVAL%(%INDEX%),tempfile))
  %IF%(%DELEFILE%(tempfile))%ENDIF%
  %IF%(result == 0)
   %WRITE%("Errore in %ATTACHADD%()")
   %RETURN%
  %ENDIF%
 %ENDIF%
 <!-- valorizza gli attributi del documento -->
 %IF%(%FILLATTR%(%TUPLEKEY%(%INDEX%),%TUPLEVAL%(%INDEX%)) == 0)
  %WRITE%(%PARSE%("Errore in %FILLATTR%(%TUPLEKEY%(%INDEX%))","%"))
  %RETURN%
 %ENDIF%
 %NUMCPY%(empty, 0)
%ENDREPEAT%
<!-- test se le coppie chiave-valore sono tutte vuote -->
%IF%(empty)
 %WRITE%("inserire qualche dato")
 %RETURN%
%ENDIF%
<!-- salvataggio del documento -->
%IF%(%SAVEDOC% <= 0)
 %WRITE%("Errore salvataggio documento")
 %RETURN%
%ENDIF%
%WRITE%("documento registrato con successo")

Con l'esecuzione di questi due script il file allegato è stato salvato e allegato al proprio documento.
Il campo allegato sarà valorizzato con l'identificativo numerico univoco che rappresenta il file allegato stesso.

Per visualizzare il documento ed il relativo allegato occorre recuperare dall'attributo allegato l'id del file, scaricarlo dal web server e visualizzarlo.

Form di visualizzazione titoli o documento
Il collegamento che consente di accedere alla visualizzazione dell'allegato, invierà la coppia chiave-valore allo script che visualizzerà l'allegato.
...
%WRITE%(%PARSE%("<A HREF=\"%SCRIPT%/A%CURARC%/Fget?id=%ATTRIB%(\"ALLEGATO\")\">%ATTRIB%(\"TESTO\")</A>","%"))
...

Form di visualizzazione allegato
<!-- controllo delle condizioni necessarie al funzionamento -->
%IF%(%STRLEN%(%KEYVAL%("ID")) == 0)
 PARAMETRO ASSENTE
 %RETURN%
%ENDIF%
<!-- funzione che ritorna l'estensione del nomefile che riceve -->
%FUNC% %STRING% %GETFILEEXT%(%STRING% nomefile)
 %RETURN%(%MID%(nomefile,%STRSTRFROM%(nomefile,".",-%STRLEN%(nomefile))+1,-1))
%ENDFUNC%
<!-- funzione che ritorna il tipo MIME richiesto dall'estensione del file da scaricare -->
%FUNC% %STRING% %GETMIME%(%STRING% fileext)
 %IF%(%STRICMP%(fileext,"TXT") == 0)
  %RETURN%("CONTENT-TYPE: TEXT/PLAIN")
 %ELIF%(%STRICMP%(fileext,"TIF") ==0 )
  %RETURN%("CONTENT-TYPE: IMAGE/TIFF")
 %ELIF%(%STRICMP%(fileext,"JPG") == 0)
  %RETURN%("CONTENT-TYPE: IMAGE/JPEG")
 %ELIF%(%STRICMP%(fileext,"PDF") == 0)
  %RETURN%("CONTENT-TYPE: APPLICATION/PDF")
 %ELIF%(%STRICMP%(fileext,"DOC") == 0)
  %RETURN%("CONTENT-TYPE: APPLICATION/MSWORD")
 %ELIF%(%STRICMP%(fileext,"RTF") == 0)
  %RETURN%("CONTENT-TYPE: APPLICATION/RTF")
 %ELIF%(%STRICMP%(fileext,"XLS") == 0)
  %RETURN%("CONTENT-TYPE: APPLICATION/X-MSEXCEL")
 %ELIF%(%STRICMP%(fileext,"WRI")==0)
  %RETURN%("CONTENT-TYPE: APPLICATION/X-MSWRITE")
 %ENDIF%
%RETURN%("CONTENT-TYPE: APPLICATION/OCTET-STREAM")
%ENDFUNC%
<!-- preleva l'id del file, ne calcola l'estensione ed il tipo MIME
e richiede il download dal server web -->
%STRING%(filename,"")
%IF%(%ATTACHGET%(filename,%KEYVAL%("ID")))
 %RETFILE%(filename,0,%GETMIME%(%GETFILEEXT%(filename)))
%ELSE%
 ERRORE IN %ATTACHGET%()
%ENDIF%

La %RETFILE% visualizzerà automaticamente il file allegato.