Bonjour,

Je souhaite dans ma page JSF télécharger des fichiers situés dans le dossier "documents" et uploader des fichiers dans ce même dossier.
Pour cela j'ai la page JSF suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
            Télécharger des documents :<br/>
            <h:dataTable value="#{tacheDetailBean.tache.documents}" var="document" id="tableDocuments">
                <h:column>
                    <h:form id="form">
                        <p:commandButton id="downloadLink" value="#{document.nom} (#{document.user.prenom} #{document.user.nom})" ajax="false" onclick="PrimeFaces.monitorDownload(start, stop)" icon="ui-icon-arrowthichk-s">  
                            <p:fileDownload value="#{downloadBean.file}" />  
                        </p:commandButton> 
                    </h:form>
                </h:column>
            </h:dataTable>
            <br/>
            Uploader des fichiers :<br/>
            <p:fileUpload fileUploadListener="#{uploadBean.upload}" allowTypes="/(\.|\/)(gif|jpe?g|png|pdf)$/" sizeLimit="100000"/>
Ainsi que les 2 beans suivants :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package control;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
 
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
 
import org.primefaces.event.FileUploadEvent;
 
@Named
@SessionScoped
public class UploadBean implements Serializable {
 
    public void upload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        // Do what you want with the file        
        try {
            copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
    public void copyFile(String fileName, InputStream in) {
        try {
 
            // write the inputStream to a FileOutputStream
            OutputStream out = new FileOutputStream(new File("./documents/" + fileName));
 
            int read = 0;
            byte[] bytes = new byte[1024];
 
            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
 
            in.close();
            out.flush();
            out.close();
 
            System.out.println("New file created!");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package control;
 
import java.io.InputStream;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
 
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
 
public class DownloadBean {
 
    private final StreamedContent file;
 
    public DownloadBean() {
        InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/documents/logofcm.png");
        file = new DefaultStreamedContent(stream, "image/png", "logofcm.png");
    }
 
    public StreamedContent getFile() {
        return file;
    }
}
Le téléchargement me donne une nullpointerexception et l'upload ne fait rien.

Merci d'avance pour votre aide.

Vivien