[ 
https://issues.apache.org/jira/browse/WICKET-6250?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15539181#comment-15539181
 ] 

Sven Meier commented on WICKET-6250:
------------------------------------

Changes for uploading of multiple files introduced a performance optimization 
in #getFileUploads() to parse the request once only.

If the page does not get serialized, the previous fileUploads are still present 
on the next request.

> FileUploadField does not deteach models and fails to null the reference to 
> the transient fileUploads field if forceCloseStreamsOnDetach is false
> ------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: WICKET-6250
>                 URL: https://issues.apache.org/jira/browse/WICKET-6250
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 6.24.0
>            Reporter: Torsten Krah
>              Labels: file_upload
>
> FileUpload does not clear our references and its model when the 
> forceCloseStreamsOnDetach is false - which does not match the expectation 
> from the javadoc:
> {code}
>   /**                                                                 
>    * The FileUploadField will close any input streams you have opened in its 
> FileUpload by
>    * default. If you wish to manage the stream yourself (e.g. you want to use 
> it in another
>    * thread) then you can override this method to prevent this behavior.
>    *                                                                  
>    * @return <code>true</code> if stream should be closed at the end of 
> request
>    */   
> {code}
> So it just is about not closing the streams.
> However the fileupload component does not only *not* close the streams - it 
> also *fails* (if you return false from the *forceCloseStreamsOnDetach* 
> method) to reset the model and forget about the current file uploads cached 
> in the transient fileUploads variable.
> {code}
>   protected void onDetach()                                           
>   {                                                                   
>     if ((fileUploads != null) && forceCloseStreamsOnDetach())         
>     {                                                                 
>       for (FileUpload fu : fileUploads)                               
>       {                                                               
>         fu.closeStreams();                                            
>       }                                                               
>       fileUploads = null;                                             
>                                                                       
>       if (getModel() != null)                                         
>       {                                                               
>         getModel().setObject(null);                                   
>       }                                                               
>     }                                                                 
>     super.onDetach();                                                 
>   }  
> {code}
> Shouldn't that read more like this:
> {code}
>   protected void onDetach()                                           
>   {                                                                   
>     if ((fileUploads != null))         
>     { 
>       if(forceCloseStreamsOnDetach() {
>        for (FileUpload fu : fileUploads)                               
>        {                                                               
>         fu.closeStreams();                                            
>        }                                                               
>       }
>       fileUploads = null;                                             
>                                                                       
>       if (getModel() != null)                                         
>       {                                                               
>         getModel().setObject(null);                                   
>       }                                                               
>     }                                                                 
>     super.onDetach();                                                 
>   }  
> {code}
> In this case my streams wouldn't be closed but you could provide new streams 
> in the next request.
> As the variable is private and i don't want to close the stream i have to use 
> reflection at the moment to reset the field to null in an overridden 
> onDeteach().



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to