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
La %RETFILE% visualizzerà automaticamente il file 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%