[ 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)