Canigó - Servei d'Upload 2.2
SERVEI D'UPLOADIntroducció
PropósitAquest servei permet que poguem llegir tractar els fitxers que hagin adjuntat els usuaris des dels formularis HTML en el seu navegador Web. Aquest tractament pot ser llegir el fitxer de forma directa, desar-lo al sistema de fitxers o per exemple emmagatzemar-lo en una base de dades. Context i Escenaris d'ÚsEl Servei de Upload de Fitxers es troba ubicat dins els serveis continguts a la capa de Presentació de canigo. Versions i DependènciesLes dependències descrites a la següent url son requerides per tal de compilar i fer funcionar el projecte: A qui va dirigitAquest document va dirigit als següents perfils:
Documents i Fonts de Referència
Descripció DetalladaArquitectura i ComponentsEls components podem classificar-los en:
JavaDoc: http://canigo.ctti.gencat.net/confluence/canigodocs/site/canigo2_0/canigo-services-fileupload/apidocs/index.html Instal- lació i ConfiguracióInstal- lacióLa instal- lació del servei requereix de la utilització de la llibreria 'canigo-services-fileupload i les dependències indicades a l'apartat 'Introducció-Versions i Dependències'. ConfiguracióLa configuració del Servei implica els següents pasos:
Definició del Servei Fitxer de configuració: canigo-services-fileupload.xml Ubicació proposada: <PROJECT_ROOT>/src/main/resources/spring Indicar el bean del servei (amb id 'fileUploadService') i la implementació escollida. Per la implementació 'FileUploadServiceImpl' definirem les següents propietats:
Exemple:
<bean id="uploadResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean> <bean id="fileUploadService" class="net.gencat.ctti.canigo.services.fileupload.impl. FileUploadServiceImpl"> <property name="maxAttachmentSize" value="$\{fileUploadService.maxAttachmentSize\}"/> <property name="logService" ref="loggingService"/> <property name="resolver" ref="uploadResolver"/> </bean> Definició de la Localització del Fitxer de Propietats del Servei ![]() Fitxer de configuració: canigo-services-configuration.xml Ubicació proposada: <PROJECT_ROOT>/src/main/resources/spring Seguint el propósit general del Servei de Configuració definirem a la propietat 'basePropertyFiles' una nova localització pel fitxer de propietats del servei. Exemple:
<bean id="configurationService" class="net.gencat.ctti.canigo.services.configuration. springframework.beans.factory.config.HostPropertyPlaceholderConfigurer"> <property name="basePropertyFiles"> <list> <value>classpath:jdbc/jdbc.properties</value> <value>classpath:mail/mail.properties</value> <value>classpath:file/fileUploadService.properties</value> <value>classpath:file/fileService.properties</value> </list> </property> </bean> Definició de les Propietats del Servei Fitxer de configuració: fileUploadService.properties Ubicació proposada: <PROJECT_ROOT>/src/main/resources/file En aquest fitxer definirem les propietats que permet el servei (veure 'Definició del Servei') fileUploadService.maxAttachmentSize=1024 Utilització del ServeiLa utilització del servei comporta 2 pasos:
Definició de la pàgina JSPA la pàgina JSP cal fer tenir en consideració:
Exemple:
<fwk:form action="files.do" styleId="actionForm" reqCode="upload" width="500" method="post" enctype="multipart/form-data">
Accés des de la classe Actioncanigo exposa una interfície d'utilització, "net.gencat.ctti.canigo.fileupload.FileUploadService", que amaga la implementació real. La interfície té el següent aspecte:
package net.gencat.ctti.canigo.services.fileupload*;* ... /** * Interface to detect fileUploads. * */ public interface FileUploadService { public static final String FILE_UPLOAD_BEAN_FACTORY_KEY="FileUploadService"; UploadedFiles getUploadedFiles(HttpServletRequest request, String[] fieldsToBind); } Aquesta interfíciee només exposa un métode 'getUploadedFiles' que a partir del 'HttpServletRequest' retorna un objecte de tipus UploadedFiles. Aquest objecte permet obtenir cadascun dels fitxers enviats. Així, podem realitzar les següents crides:
Per últim, una vegada obtingut un 'UploadFile' en concret podem obtenir la seva informació i les seves dades de vàries formes (veure la signatura dels mètodes continguts a la interfície).
public interface UploadedFile { String getName(); boolean isEmpty(); String getOriginalFilename(); String getContentType(); long getSize(); byte[] getBytes() throws IOException; InputStream getInputStream() throws IOException; void transferTo(File dest) throws IOException, IllegalStateException; } Val la pena observar que mitjançant el métode getInputStream es possible llegit l'objecte per tal de transferir-lo per entrada-sortida java convencional, però a més el mètode "transferTo" possibilita exportar el fitxer pujar a un destí de fitxer en el servidor. Si hi ha qualsevol error com per exemple que excedeixi el límit configurable de tamany de fitxers, la implementació llença una "net.gencat.ctti.canigo.services.fileupload.exception.FileServiceException" on s'especifican els detalls de l'error (error, codi d'error, capa i subsistema). Eines de SuportIntegració amb Altres ServeisIntegració amb el Servei Multiidioma i ExcepcionsEl Servei de Upload de Fitxers llença vàries excepcions amb codis per tal que el missatge pugui ser internacionalitzat. En el següent exemple es mostren els codis que s'han de definir: canigo.services.fileupload.attachment_size_exceeded=Attachment size exceeded: {0} bytes (max: {1}*)* ExemplesExempleExemple de formulari
<fwk:form action="files.do" styleId="actionForm" reqCode="upload" width="500" method="post" enctype="multipart/form-data"> <fwk:text styleId="currentDir" property="currentDir"/> <fwk:file styleId="file" property="file"/> <fwk:submit styleId="uploadActionImage"/> </fwk:form> Exemple d'accés des de la Action
UploadedFiles files = FileUploadServiceUtils.getFiles( context.getRequest(), new String[] {"file1"}); if(files.hasFiles()){ if(files.isFileAvailable("file1")){ UploadedFile file1 = files.getFile("file1"); } } En aquest cas hem fet servir el mètode estàtic "getFiles" de la classe auxiliar "net.gencat.ctti.canigo.services.fileupload.FileUploadServiceUtils" Aquest mètode permet utilitzar el servei sense haver de localitzar-lo expressament. |