Problème téléchargement fichiers volumineux java.lang.OutOfMemoryError
Bonjours
sur une page JSF, je veux télécharger des fichiers volumineux, dans mon bean je me connecte sur un server FTP (FileZilla Server) à l'aide de l'API commons net, pour les fichiers de petite taille ca marche bien, mais pour les fichier dont la taille dépasse 40Mo j'ai un "java.lang.OutOfMemoryError: Java heap space"
j'ai chercher sur net, mais malheureusement, j'ai rien trouvé
Merci d'avance
codes :
page JSF :
Code:
1 2 3 4 5 6 7 8
|
<h:commandLink actionListener="#{explorer.downloadListener}" immediate="true" style="text-decoration : none;">
<h:panelGrid columns="2">
<h:graphicImage id="download" value="/img/menu/download.png" style="border:0; text-decoration : none;" height="25" width="25" title="Télécharger"/>
<h:outputLabel value="Télécharger" for="download" style="border:0"/>
</h:panelGrid>
<a4j:support oncomplete="if (#{!empty facesContext.maximumSeverity}){Richfaces.showModalPanel('Alerte1');}"/>
</h:commandLink> |
code Bean.Methode telechargement:
Code:
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
|
public void downloadListener(ActionEvent evt){
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ec = context.getExternalContext();
HttpServletResponse response = (HttpServletResponse) ec.getResponse();
response.reset();
response.setHeader("Content-Transfer-Encoding", "binary");
//response.setContentType("application/download");
response.setHeader("Content-disposition", "attachment;filename=\""+ this.selectedRow.getNom() + "\"");
try{
client.connect("127.0.0.1");
client.login("compteFTP", "pwdFTP");
client.setFileType(FTP.BINARY_FILE_TYPE);
ServletOutputStream sop = response.getOutputStream();
InputStream ins=client.retrieveFileStream(this.selectedRow.getPath()+"/"+selectedRow.getNom());
int read=0;
byte[] bytes = new byte[1024];
while((read = ins.read(bytes)) != -1){
sop.write(bytes,0,read);
}
sop.flush();
sop.close();
context.responseComplete();
}catch(IOException e) {
e.printStackTrace();
} finally {
try {
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
} |
code Erreur :
Code:
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
|
GRAVE: Received 'java.lang.OutOfMemoryError' when invoking action listener '#{explorer.downloadListener}' for component 'j_id_jsp_527137651_54'
23 juil. 2010 12:46:14 javax.faces.event.MethodExpressionActionListener processAction
GRAVE: java.lang.OutOfMemoryError: Java heap space
at org.ajax4jsf.io.ByteBuffer.<init>(ByteBuffer.java:54)
at org.ajax4jsf.io.ByteBuffer.append(ByteBuffer.java:112)
at org.ajax4jsf.io.FastBufferOutputStream.write(FastBufferOutputStream.java:107)
at org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream.write(FilterServletResponseWrapper.java:277)
at still.ftp.beans.ExplorerManager.downloadListener(ExplorerManager.java:1543)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:191)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:99)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:759)
at javax.faces.component.UICommand.broadcast(UICommand.java:372)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:409)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) |
code filter a4j sur le web.xml
Code:
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
|
<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
<init-param>
<param-name>createTempFiles</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxRequestSize</param-name>
<param-value>1024000000</param-value>
</init-param>
<init-param>
<param-name>force-parser</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>enable-cache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>regex-url-pattern</param-name>
<param-value>^(?:[^/]|/(?!file/))*$</param-value>
</init-param>
</filter> |
j'utilise
JSF1.2, RichFaces3.3.3, Tomcat6