Darrera actualització: 27-03-2015

Propòsit

Aquest mòdul permet al servidor obtenir fitxers adjunts als formularis HTML de client. A més aquest mòdul permet llegir el fitxer de forma directa, deser-lo al sistema de fitxers, emmagatzemar-lo en una base de dades o enllaçar-ho amb altres mòduls com pot ser el servei d’antivirus.

Instal.lació i Configuració

Instal.lació

Per tal d’instal-lar el mòdul d’upload de fitxers es pot incloure automàticament a través de l’eina de suport al desenvolupament o bé afegir manualment en el pom.xml de l’aplicació la següent dependència:

<canigo.support.fileupload.version>[1.1.0,1.2.0)</canigo.support.fileupload.version>

<dependency>
  <groupId>cat.gencat.ctti</groupId>
  <artifactId>canigo.support.fileupload</artifactId>
  <version>${canigo.support.fileupload.version}</version>
</dependency>

JSF

Per aplicacions Canigó 3 basades en JSF 2.2 s’ha d’afegir la següent dependència amb la llibreria MyFaces Tomahawk, automàticament a través de l’eina de suport al desenvolupament o bé afegint-la manualment en el pom.xml de l’aplicació:

<tomahawk>1.1.14</tomahawk>
<dependency>
    <groupId>org.apache.myfaces.tomahawk</groupId>
    <artifactId>tomahawk21</artifactId>
    <version>${tomahawk}</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-validator</artifactId>
            <groupId>commons-validator</groupId>
        </exclusion>
        <exclusion>
            <artifactId>itext</artifactId>
            <groupId>com.lowagie</groupId>
        </exclusion>
        <exclusion>
            <artifactId>jstl</artifactId>
            <groupId>javax.servlet</groupId>
        </exclusion>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
        <exclusion>
            <artifactId>batik-awt-util</artifactId>
            <groupId>org.apache.xmlgraphics</groupId>
        </exclusion>
    </exclusions>
</dependency>

Configuració

La configuració es realitza automàticament a partir de la eina de suport al desenvolupament.

JSF

En el cas d’utilitzar la opció de JSF, el que fa és afegir al web.xml el següent filtre per a interceptar les peticions multipart/form-data:

<filter>
    <filter-name>Extensions Filter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    <init-param>
        <param-name>uploadMaxFileSize</param-name>
        <param-value>20m</param-value>
        <description>Set the size limit for uploaded files.
            Format: 10 - 10 bytes
                    10k - 10 KB
                    10m - 10 MB
                    1g - 1 GB
        </description>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Extensions Filter</filter-name>
    <url-pattern>*.jsf</url-pattern>
</filter-mapping>

Cal afegir manualment en la jsf la següent capçalera:

xmlns:t="http://myfaces.apache.org/tomahawk"

Struts + Taglibs

En el cas d’utilitzar la opció d’Struts + Taglibs, la configuració del servei es realitza mitjançant un fitxer de propietats.

Ubicació proposada: <PROJECT_ROOT>/src/main/resources/config/props/fileupload.properties

Propietat Requerit Descripció
*.fileUpload.defaultEncoding No Direcció IP del servidor Engine Scan del CTTI, responsable dels escaneigs.
*.fileUpload.maxUploadSize No Màxim tamany permés abans que es rebutgin els fitxers. Valor per defecte: -1(no hi ha límit).
*.fileUpload.maxInMemorySize No Màxim tamany permés en bytes abans de guardar en disc. Valor per defecte: 10240 (bytes).
*.fileUpload.launchExceptionIfVirusDetected No Opció només disponible per a la integració del fileupload i antivirus. Indica si es llençarà una excepció al servei en el cas de que es trobi un virus en l’arxiu pujat. Valor per defecte: true.

Utilització del Mòdul

JSF

Per a utilitzar aquest mòdul, cal crear un bean i una jsf:

fileUploadBean.java

@Component("fileUploadBean")
@Scope("singleton")
@Lazy
public class FileUploadBean {

	@Autowired
	private I18nResourceBundleMessageSource messageResource;
	private UploadedFile uploadedFile;

	public void submit() {

		try {
			if(getUploadedFile()!=null & getUploadedFile().getBytes()!=null){
				// Show succes message.
			    FacesContext.getCurrentInstance().addMessage("uploadForm", new FacesMessage(
			        FacesMessage.SEVERITY_INFO, messageResource.getMessage("fileUploadSuccess"), null));
			}else{
				// Show succes message.
			    FacesContext.getCurrentInstance().addMessage("uploadForm", new FacesMessage(
			        FacesMessage.SEVERITY_ERROR, messageResource.getMessage("fileUploadError"), null));
			}
		} catch (IOException e) {
			FacesContext.getCurrentInstance().addMessage("uploadForm", new FacesMessage(
			        FacesMessage.SEVERITY_ERROR, messageResource.getMessage("fileUploadError"), null));
		}

	}

	public UploadedFile getUploadedFile() {
		return uploadedFile;
	}

	public void setUploadedFile(UploadedFile uploadedFile) {
		this.uploadedFile = uploadedFile;
	}

}

fileUpload.jsf

<h:form id="uploadForm" enctype="multipart/form-data">
    <h:panelGrid columns="3">
        <h:outputLabel for="file" value="#{msg.fileUploadSelectFile}" />
        <t:inputFileUpload id="file" value="#{fileUploadBean.uploadedFile}" required="true" />
        <h:message for="file" style="color: red;" />
        <h:panelGroup />
        <h:commandButton value="#{msg.canigoSubmit}" action="#{fileUploadBean.submit}" />
        <h:message for="uploadForm" infoStyle="color: green;" errorStyle="color: red;" />
    </h:panelGrid>
</h:form>

STRUTS+TAGLIBS

Per a utilitzar el mòdul cal crear una Acció i una JSP:

app-fileupload.xml

<bean name="/fileUpload" class="cat.gencat.ctti.canigo.demo.fileupload.FileUploadAction" scope="prototype">
    <property name="pojoClass" value="cat.gencat.ctti.canigo.demo.fileupload.FileUploadPojo"></property>
    <property name="fileUpload" ref="fileUploadService" />
    <!-- Configuració dels tags -->
    <property name="tagsConfiguration">
        <map>
            <entry key="*">
                <list>
                    <bean parent="formTag">
                        <property name="styleId" value="actionForm"></property>
                        <property name="layout" value="true"/>
                        <property name="validationProperties">
                            <props>
                                <prop key="validationType">SERVER</prop>
                                <prop key="validatorName">uploadValidations</prop>
                            </props>
                        </property>
                    </bean>
                    <bean parent="submitTag">
                        <property name="styleId" value="uploadSubmit"/>
                        <property name="mode" value="N,D,N"/>
                        <property name="reqCode" value="valida"/>
                        <property name="key" value="forms.buttons.valida"/>
                        <bean parent="fileFieldTag">
                            <property name="styleId" value="fileText"></property>
                            <property name="layout" value="false"></property>
                            <property name="mode" value = "E,E,E"></property>
                        </bean>
                    </bean>
                </list>
            </entry>
        </map>
    </property>
</bean>

FileUploadAction.java

public class FileUploadAction extends DispatchActionSupport {

	private final String FORWARD_SUCCESS = "success";

	private static final Log log = LogFactory.getLog(FileUploadAction.class);

	private FileUploadService fileUpload;


	/**
	 * Mètode que es crida pel reqCode=inici
	 * @param mapping ActionMapping
	 * @param form ActionForm
	 * @param request HttpServletRequest
	 * @param response HttpServletResponse
	 * @return ActionForward
	 * @throws Exception exception
	 */
	public ActionForward upload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		log.info("FileUploadAction [inici] - Inici");

		SpringBindingActionForm actionForm = (SpringBindingActionForm)form;
		FileUploadPojo pojo = (FileUploadPojo) actionForm.getTarget();

		String[] UPLOADED_FILES = new String[] { "fitxer" };
		UploadedFiles uploadedFiles = this.fileUpload.getUploadedFiles(request, UPLOADED_FILES);
		UploadedFile fitxerCarregat = uploadedFiles.getFile("fitxer");

		return mapping.findForward(FORWARD_SUCCESS);
	}

	public FileUploadService getFileUpload() {
		return fileUpload;
	}

	public void setFileUpload(FileUploadService fileUpload) {
		this.fileUpload = fileUpload;
	}
}

fileUpload.jsp

<fwk:form styleId="actionForm" action="sfileUpload.do?reqCode=upload" method="POST" enctype="multipart/form-data">
	<fwk:row>
		<fwk:file styleId="fileText" property="fitxer" key="label.fileupload.path"></fwk:file>
	</fwk:row>
	<fwk:row>
		<fwk:submit styleId="uploadSubmit"></fwk:submit>
	</fwk:row>
</fwk:form>