Foren

Lien vers un fichier pdf+Liferay

Fairouz F, geändert vor 12 Jahren.

Lien vers un fichier pdf+Liferay

Junior Member Beiträge: 52 Beitrittsdatum: 03.02.11 Neueste Beiträge
Bonjour,

je veux créer un lien vers un fichier .pdf ou .doc qui se trouve sur mon PC en utilsant JSF.
J'ai toujours le même message d'erreur qui m'indique que le chemin est invalide.
sachant que j'utilise Liferay 6.05 et ubuntu 10.04 LTS.
Merci de me répondre.
thumbnail
Leo PRATLONG, geändert vor 12 Jahren.

RE: Lien vers un fichier pdf+Liferay

Expert Beiträge: 363 Beitrittsdatum: 06.07.10 Neueste Beiträge
Pouvez-vous être plus précis ?
Un lien vers un fichier qui se trouve sur le poste client ou sur le serveur ?

Pour l'upload en JSF, c'est toujours un peu complexe. J'ai écrit ce code il y a un moment donc il y a peut etre des trucs à revoir. En tout cas il marche :
Vous aurez besoin de apache.commons.fileupload.

Créer une classe qui étend ActionRequestWrapper :

public class FileUploadActionRequestWrapper extends ActionRequestWrapper {
	
    private final Map<string, string[]> parameters = new HashMap<string, string[]>();
	
    public FileUploadActionRequestWrapper(final ActionRequest request) 
            throws FileUploadException {
        super(request);

        if (PortletFileUploadUtils.isMultipart(request)) {
            final List<fileitem> items = PortletFileUploadUtils.parseRequest(request);
            final Map<string, fileitem> files = PortletFileUploadUtils.getFiles(items);
            for (final String name : files.keySet()) {
                setAttribute(files.get(name).getFieldName(), files.get(name));
            }
            final Map<string, string> pars = PortletFileUploadUtils.getParameters(items);
            for (final String name : pars.keySet()) {
                final String[] values = new String[1];
                values[0] = pars.get(name);
                parameters.put(name, values);
            }
        }
    }
	
    @Override
    public Map<string, string[]> getParameterMap() {
        return parameters;
    }
	
    @Override
    public String getParameter(final String name) {
        final String[] values = parameters.get(name);
        if (values != null &amp;&amp; values.length &gt; 0) {
            return values[0];
        }
        return null;
    }

    @Override
    public String[] getParameterValues(final String name) {
        return parameters.get(name);
    }

    @Override
    public Enumeration<string> getParameterNames() {
        return Collections.enumeration(parameters.keySet());
    }
}
</string></string,></string,></string,></fileitem></string,></string,>


Ajout de la classe utilitaire :

public final class PortletFileUploadUtils {

    private PortletFileUploadUtils(){}

    public static boolean isMultipart(final ActionRequest request) {
        return PortletFileUpload.isMultipartContent(request);
    }
	
    public static List<fileitem> parseRequest(final ActionRequest request) throws FileUploadException {
        final FileItemFactory factory = new DiskFileItemFactory(); 
        final PortletFileUpload upload = new PortletFileUpload(factory);
        return upload.parseRequest(request);
    }
	
    public static Map<string, string> getParameters(final List<fileitem> items) {
        final Map<string, string> result = new HashMap<string, string>();
        for (final FileItem item : items) {
            if (item.isFormField()) {
                result.put(item.getFieldName(), item.getString());
            }
        }
        return result;
    }

    public static Map<string, fileitem> getFiles(final List<fileitem> items) {
        final Map<string, fileitem> result = new HashMap<string, fileitem>();
        for (final FileItem item : items) {
            if (!item.isFormField()) {
                result.put(item.getName(), item);
            }
        }
        return result;
    }
}
</string,></string,></fileitem></string,></string,></string,></fileitem></string,></fileitem>


Ensuite, vous créez une classe qui étend GenericFacesPortlet :

public class UploadFacesPortlet extends GenericFacesPortlet {
    private static Logger LOGGER = Logger.getLogger(UploadFacesPortlet.class.getName());
 
    public UploadFacesPortlet() {
        super();
    }
 
    @Override
    public void processAction(ActionRequest request, ActionResponse response)
            throws IOException, PortletException {
 
        ActionRequest myRequest = request;
 
        if (PortletFileUploadUtils.isMultipart(request)) {
            try {
                myRequest = new FileUploadActionRequestWrapper(request);
            } catch (FileUploadException e) {
                LOGGER.log(Level.SEVERE, "File upload failed during the wrapping of the request.");
            }
        }
        super.processAction(myRequest, response);
    }
}


Et dans le fichier portlet.xml, vous indiquez cette dernière classe comme étant votre portlet-class :

<portlet-class>org.package.UploadFacesPortlet</portlet-class>


Ensuite, de manière traditionnelle, dans votre JSP (ou Facelet) :

<h:form enctype="multipart/form-data">
      <input type="file" name="uploadedFile">
      <h:commandbutton value="Apply" action="#{controller.uploadFile}" />
 </h:form>


Et dans votre Contrôleur, une fois que le commandButton a appelé l'action et que vous souhaitez récupérer votre fichier :

public void uploadFile() {
        final FacesContext context = FacesContext.getCurrentInstance();
        final ActionRequest request = (ActionRequest) JSFPortletUtil.getPortletRequest(context);
        final FileItem item = (FileItem) request.getAttribute("uploadedFile");
        // item contient un InputStream
    }



NB : avec l'utilisation de cette technique, j'ai rencontré des problèmes avec l'utilisation du type d'encodage "multipart/form-data" dans mes Facelets. J'ai donc été obligé de créer un form spécifique à mon input File sinon je perdais certaines valeurs de ma parameter map (je ne sais plus très précisément la raison).
Fairouz F, geändert vor 12 Jahren.

RE: Lien vers un fichier pdf+Liferay

Junior Member Beiträge: 52 Beitrittsdatum: 03.02.11 Neueste Beiträge
je veux savoir comment créer un lien vers un fichier qui se trouve sur le poste client ?
Est-ce que vous avez une idée?
Merci d'avance!!!
thumbnail
Leo PRATLONG, geändert vor 12 Jahren.

RE: Lien vers un fichier pdf+Liferay

Expert Beiträge: 363 Beitrittsdatum: 06.07.10 Neueste Beiträge
Ceci n'est pas faisable en web (en tout cas, si j'ai bien compris la demande). Votre besoin semble de pouvoir rendre disponible un fichier du poste client à tous les utilisateurs. Dans ce cas, il faut créer une fonction d'upload de ce fichier (comme expliqué plus haut). Et je dois bien avouer que l'upload en JSF est particulièrement énervant à faire.

Néanmoins, si vous souhaitez simplement créer un lien vers un fichier d'un poste client MAIS uniquement disponible pour l'utilisateur en de ce poste, dans ce cas, il vous suffirait dans l'absolu d'utiliser un composant de type input file en HTML et de récupérer le chemin après que l'utilisateur ait choisi un fichier. Pour cela, pas besoin de créer la fonction d'upload (d'ailleurs, si je me souviens bien, sans cet upload, la valeur récupéré côté serveur pour l'input file sera le chemin du fichier sur le poste client).