bonjour tous le monde ,
comment ,a paritr d'une page jsf , peut on consulter un fichier (pdf ou excel ) qui se situe dans un emplacement connu dans le serveur ,
bonjour tous le monde ,
comment ,a paritr d'une page jsf , peut on consulter un fichier (pdf ou excel ) qui se situe dans un emplacement connu dans le serveur ,
bien tous dépend de se que tu veut faire, si part exemple tu veut accéder et extraire les données tu peut le faire en java, coté jsf tu fait juste l'appelle a ta méthode java
mais si tu veut afficher la page pdf dans le navigateur la c autre chose
bonjour
oui dans mon serveur Jboss4.2.3GA j'ai un répéroitre contenant des fichiers ( chaque fichier est en trois formats: .pdf , .xls et .csv) dans un premièr temps j'affiche le contenu de mon répértoire dans un DataTable du 4 colonnes , dans chaque ligne du DataTable j'ai le nom du fichier ainsi que des commandlinks pour telecharger le fichier sous les trois formats (lien pour le telecharger en pdf ,un autre en xls et le dernier en csv ) ;
merci
alors dons ce cas la tu peut faire des méthodes java qui se charge de télécharger les fichiers avec n'importe quelle format.
Exemple :
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 public static byte[] loadFile(String FileName) throws IOException { FileInputStream fis = null; BufferedInputStream fileInBuf = null; try { if (FileName == null) { return new byte[0]; } FileInputStream fileIn = new FileInputStream(FileName); fileInBuf = new BufferedInputStream(fileIn); fis = new FileInputStream(FileName); final int BUF_SIZE = 4096; byte buf[] = new byte[BUF_SIZE]; int length = 0; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((length = fileInBuf.read(buf)) > 0) { baos.write(buf, 0, length); } return baos.toByteArray(); } catch (IOException e) { throw e; } finally { try { if (fis != null) { fis.close(); } if (fileInBuf != null) { fileInBuf.close(); } } catch (Exception e) { } } }
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public String getUploadElement() { HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); int buf_size = 32120; int chunk_size = 48 * 1024; ResourceBundle rb = ResourceBundle.getBundle("ApplicationResources"); URL news = null; try { news = new URL(adresse); if (LOGGER.isDebugEnabled()) LOGGER.debug("-------****** news: " + news); HttpURLConnection urlconnection = (HttpURLConnection)news.openConnection(); urlconnection.setDoOutput(true); urlconnection.setDoInput(true); urlconnection.setUseCaches (false); urlconnection.setDefaultUseCaches (false); urlconnection.setChunkedStreamingMode(chunk_size); urlconnection.setReadTimeout(0); OutputStreamWriter out = new OutputStreamWriter(urlconnection.getOutputStream()); out.write(sb.toString()); InputStream is = urlconnection.getInputStream(); int f = -1; File tmpFile = File.createTempFile("documentation", ".zip"); byte buf[] = new byte[buf_size]; int length = 0; BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tmpFile)); while ((length = is.read(buf)) > 0) { bos.write(buf, 0, length); } bos.close(); is.close(); response.setContentType("application/pdf"); response.addHeader("Content-Disposition", "attachment; filename=" + tmpFile.getName()); response.setHeader("Cache-Control","max-age=" + 90000); response.addHeader("Content-description","My Description"); byte[] docfile = loadFile(tmpFile.getPath()); response.setContentLength(docfile.length); f = -1; is = new FileInputStream(tmpFile); copy(is, response.getOutputStream()); response.getOutputStream().flush(); is.close(); tmpFile.delete(); } catch (Exception e) { LOGGER.error("Erreur", e); return "messageError"; } return ""; }
après il faut que t'a le lien du fichier et tu fait appelle a cette fonction "getUploadElement" a travers le paramètre action de t'a commande jsf.
Bonjour
merci Arthurs pour ta réponse ,mais dans ta solution ou je vais préciser le chemin du fichier a telcharger ?
je vais vous expliquer mon problème :
dans Jboss4.2.3GA j'ai crée un répéroitre "Reports" qui contient 12 fichiers (4 fichiers chaque un d'eux en trois formats : pdf , xls et csv ) et j 'ai déclarer mon répertoire dans mon web.xml
dans l'une de mes page jsf j'ai un Datatable qui contient les noms des fichiers ( sans extension) et des commandlink pour les telecharger sous le formats voulu(soit pdf soit xls soit csv)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <context-param> <param-name>Report</param-name> <param-value>D:\jboss-4.2.3.GA\Reports</param-value> </context-param>
le code du ma page est la suivante:
loadXLS , loadPDF et loadCSV sont des méthodes dans le beans qui associé à la page que j'ai cité ci dessus
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 <html:form> <html:dataTable headerClass="headers" width="100%" value="#{Report.reports}" var="ligne" rowClasses="ligne1,ligne2" > <html:column> <core:facet name="header" > <html:outputText value="Fichier "/> </core:facet> <html:outputText value="#{ligne}" /> </html:column> <html:column > <core:facet name="header"> <html:outputText value="PDF " /> </core:facet> <html:commandLink action="#{Report.loadPDF}" title="telecharger le fichier en format PDF" style="text-decoration :none ;"> <html:graphicImage value="/image/pdf.GIF" styleClass="image"/> </html:commandLink> </html:column> <html:column> <core:facet name="header"> <html:outputText value="CSV "/> </core:facet> <html:commandLink action="#{Report.loadCSV}" title="telecharger le fichier en format CSV" style="text-decoration :none ;"> <html:graphicImage value="/image/csv.GIF" styleClass="image"/> </html:commandLink> </html:column> <html:column> <core:facet name="header"> <html:outputText value="XLS "/> </core:facet> <html:commandLink action="#{Report.loadXLS}" title="telecharger le fichier en format XLS" style="text-decoration :none ;"> <html:graphicImage value="/image/xls.GIF" styleClass="image"/> </html:commandLink> </html:column> </html:dataTable> </html:form>
j'ai essayer un code pour les méthodes précédantes mais le problème c'est comment récupérer, a partir du DataTable ,le nom du fichier qui se trouve dans la meme ligne que le commandlink qui a provoqué l'action
le corps des méthodes loadXLS ,loadPDF et loadCSV et le suivant:
vous trouverez ci joint un exemple du mon DataTable
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 public Class ReportBean{ private List reports=null;//list pour remplire la colonne "Fichier" du DataTable String context = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("Report"); ............/traitement pour remplir la liste public void loadPDF() throws IOException{ String nom="";//c'est ce nom que je dois récupérer de la DataTable String reportPath =context+"\\"+nom+".pdf"; File file = new File(reportPath); byte[] fileData = new byte[(int) file.length()]; HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setHeader("Content-disposition", "attachment;filename=rapport.pdf"); response.setContentLength(fileData.length); response.getOutputStream().write(fileData); response.setContentType("application/pdf"); response.getOutputStream().flush(); response.getOutputStream().close(); } public void loadXLS() throws IOException{ String nom="";//c'est le nom qui existe dans la meme ligne avec le //Commandlink generant l'action loadXLS String reportPath =context+"\\"+nom+".xls"; File file = new File(reportPath); byte[] fileData = new byte[(int) file.length()]; HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setHeader("Content-disposition", "attachment;filename=rapport.xls"); response.setContentLength(fileData.length); response.getOutputStream().write(fileData); response.setContentType("application/vnd.ms-excel"); response.getOutputStream().flush(); response.getOutputStream().close(); } public void loadCSV() throws IOException{ String nom="";/c'est ce nom que je dois récupérer de la DataTable String reportPath =context+"\\"+nom+".csv"; File file = new File(reportPath); byte[] fileData = new byte[(int) file.length()]; HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setHeader("Content-disposition", "attachment;filename=rapport.csv"); response.setContentLength(fileData.length); response.getOutputStream().write(fileData); response.setContentType("text/csv"); response.getOutputStream().flush(); response.getOutputStream().close(); } }
merci
Pour avoir la ligne tu peut utiliser le DataModel de la librairie Faces
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // déclaration de ton dataModel private DataModel monDataModel = new ListDataModel(); // lier ton Report.reports avec ce dataModel monDataModel.setWrappedData(Report.reports); // danns tes fonction loadPDF .. tu fait ça pour avoir la ligne TonBeanReport bean = (TonBeanReport) monDataModel.getRowData();
puis c'est le monDataModel que tu le met dans ta page jsf dans le datatable, tien un lien qui peut t'aider aussi
http://java.developpez.com/faq/jsf/?...le_active_row1
bonjour
merci Arthuris pour ton aides ,avant j'ai lu le faq mais j'ai pas bien saisie comment utiliser le DataModel maintenent c'est super, j'obtiens la valeur de la ligne du Datatable par :
avec reportmodel est mon DataModel avec lequel je rempli ma DataTable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 String nomfichier =(String) reportmodel.getRowData();
merci encore pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2<h:DataTable value="#{Backup.reportmodel}"...>
Partager