Jalios Community
Spaces
Content
We have not found any result for your search.
We have not found any result for your search.

Formulaire spécifique avec plusieurs fichiers (un seul champ)

Bonjour,

Je souhaite mettre en place un formulaire spécifique ou l'utilisateur pourra déposer un ou plusieurs fichiersdans un même champ

Nous pensons donc utiliser un champ comme suit (https://docs.jalios.com/jplatform10/jcms/fr/front-end/formulaires/standard-html-inputs/forms-file-2037)

<jalios:field name="file1" label="File"> <jalios:control type="<%= ControlType.FILE %>" /> </jalios:field>

 

Dans le JCMSFormHandler, je ne sais pas comment récupérer ces fichiers (j'y arrive bien sur un champ monovalué, mais le traitement est diffférent)

Merci d'avance pour votre aide,

2 pts
1 answer
Expert Olivier Jaquemet on 10/13/21 at 11:10 AM

Bonjour,

Regardez cette précédente réponse qui contient déjà un certain nombre d'indication : Answer on "FormHandler et fichier"

Il faudra l'adapter pour utiliser les variantes de signature méthode permettant la récupération de plusieurs fichier/documents.

Philippe Grisolano on 10/13/21 at 11:34 AM

Bonjour Olivier,

J'ai vu cette discussion, mais cela ne m'a pas aidé,

J'ai essayé en changeant la signature pour utiliser un tableau mais cela ne passe pas dedans, setFaxFile(File[] faxFile)

Est-ce que vous avez plus de précisions svp ?

Merci,

Expert Olivier Jaquemet on 10/13/21 at 12:32 PM
  • Ne mettez pas de setter dans votre handler 
  • Utilisez getUploadedFileList() à la place de getUploadedFile(...) que j'avais pointé dans l'exemple
Philippe Grisolano on 10/13/21 at 12:59 PM

Je dois mal faire quelque chose, la méthode getUploadedFile me renvoi null,

Est-ce qu'il y a d'autres prérequis dans la JSP par exemple ?

Merci

Expert Olivier Jaquemet on 10/13/21 at 2:07 PM

Pour récupérer plusieurs fichiers, utilisez List<DocUploadInfo> uploadList = getUploadedFileList(fieldName,true|false,false);pas getUploadedFile(...) 

Philippe Grisolano on 10/13/21 at 2:15 PM

Oui pardon j'avais bien suivi votre conseil avec l'utilisation de cette méthode :  getUploadedFileList("faxFile",false,false);

C'est celle là qui me retourne null

Expert Olivier Jaquemet on 10/13/21 at 2:27 PM

C'est bien la démarche à suivre.

  • Vérifiez que votre form contient bien les prérequis
    <form  ... method="post" accept-charset="UTF-8" enctype="multipart/form-data">
  • Vérifiez que le nom  de votre input file est bien le même coté JSP et dans le code Java
  • Vérifiez que votre JSP déclare le handler est accept les paramétres *
Philippe Grisolano on 10/13/21 at 2:34 PM

A priori cela me semble bon, il doit il y avoir autre choses, vous auriez pas un exemple simple qui fonctionne ?

Merci

Expert Olivier Jaquemet on 10/13/21 at 3:18 PM

Java :

package com.example.jcmsplugin.demo;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.log4j.Logger;

import com.jalios.jcms.context.JcmsMessage;
import com.jalios.jcms.context.JcmsMessage.Level;
import com.jalios.jcms.handler.JcmsFormHandler;
import com.jalios.jcms.upload.DocUploadInfo;

public class MyFormHandler extends JcmsFormHandler {

  private boolean opSubmit = false;
  
  private File uploadedFile;
  private List<File> uploadedFiles;
  
  @Override
  public boolean processAction() throws IOException {
    if (validateSubmit()) {
      return performSubmit();
    }
    return false;
  }
  
  private boolean validateSubmit() throws IOException {
    if (!opSubmit) {
      return false;
    }

    // Check security
    if (!isLogged) {
      return false;
    }

    // myFile
    DocUploadInfo docUploadInfo = (DocUploadInfo) getUploadedFile("myFile",false,false);
    if (docUploadInfo == null || docUploadInfo.getStatus() > 1){
      String missingFileMsg = glp("jcmsplugin.myplugin.missing-file");
      addMsgSession(new JcmsMessage("jcmsplugin.myplugin.missing-file", Level.WARN, missingFileMsg));
      return false;
    }
    
    // myFiles
    List<DocUploadInfo> docUploadInfoList = getUploadedFileList("myFiles",false,false);
    if (docUploadInfoList == null || docUploadInfoList.stream().anyMatch(dui -> dui.getStatus() > 1)){
      String missingFileMsg = glp("jcmsplugin.myplugin.missing-files");
      addMsgSession(new JcmsMessage("jcmsplugin.myplugin.missing-files", Level.WARN, missingFileMsg));
      return false;
    }

    this.uploadedFile = docUploadInfo.getFile();
    this.uploadedFiles = docUploadInfoList.stream().map(DocUploadInfo::getFile).collect(Collectors.toList());
    
    // TODO : check uploadedFile with you own criteria
//    if (!isOK(uploadFile)) {
//      // TODO : localized error msg sent to user
//      return false;
//    }

    return true;
  }
  
  private boolean performSubmit() throws IOException {
    
    String msg = "myFile size : " + uploadedFile.length() + "<br>" + 
                 "myFiles size: " + uploadedFiles.stream().map(File::length).map(String::valueOf).collect(Collectors.joining(", "));
    addMsgSession(new JcmsMessage(Level.INFO, msg));
    
    return false;
  }
  
  public void setOpSubmit(String value) {
    this.opSubmit = true;
  }
}

JSP : 

<%@ include file="/jcore/doInitPage.jspf" %><%
%><jsp:useBean id="formHandler" scope="page" class="com.example.jcmsplugin.demo.MyFormHandler"><%
 %><jsp:setProperty name="formHandler" property="request"  value="<%= request %>"/><%
 %><jsp:setProperty name="formHandler" property="response" value="<%= response %>"/><%
 %><jsp:setProperty name="formHandler" property="*" /><%
%></jsp:useBean><%

if (formHandler.validate()) {
  return;
}

%><%@ include file="/jcore/doEmptyHeader.jspf" %><%
%><%@ include file="/jcore/doMessageBox.jspf" %>

<form id="myUploadFormId" name="myUploadForm" action="<%= ServletUtil.getResourcePath(request) %>" method="post" accept-charset="UTF-8" enctype="multipart/form-data">

 <div class="form-horizontal">
   <jalios:field name="myFile" label="My File (TO I18N)">
     <jalios:control type="<%= ControlType.FILE %>" />
   </jalios:field>
   <jalios:field name="myFiles" label="My Files (TO I18N)">
     <jalios:control type="<%= ControlType.FILE %>" />
   </jalios:field>
 </div>

 <button class="btn btn-primary" type="submit"  name="opSubmit" value="true"><%= glp("ui.com.btn.submit") %></button>
</form>

<%@ include file="/jcore/doEmptyFooter.jspf" %>
Philippe Grisolano on 10/13/21 at 4:14 PM

Merci pour l'exemple complet, mais j'ai le même résultat, les méthodes getUploadedFile et getUploadedFileList me renvoie null

Expert Olivier Jaquemet on 10/13/21 at 4:20 PM

Il y a donc un soucis dans votre environnement, car cet exemple est fonctionnel.

Assurez-vous d'utiliser la dernière version de maintenance du produit.
Vérifiez les logs d'erreurs et la configuration de votre serveur d'application. 

Et si le pb persiste, n'hésitez pas à solliciter une prestation d'assistance auprès de nos consultants pour ce développement spécifique.

Philippe Grisolano on 10/13/21 at 7:39 PM

Pouvez vous juste me dire comment vous utilisez la jsp, est-ce que vous l'appelez directement ? dans une portlet ? ...

J'utilise en tout cas la dernière version de Jalios, je suis sur un poste de développement

Merci

Expert Olivier Jaquemet on 10/14/21 at 9:24 AM

J'ai accédé à cette JSP directement depuis le navigateur.

1 pt