I had had AjaxDownLoad implemented as below and download initiated. It stopped the Ajax debug error, but did not show dialog box to save.
I might not be setting the resource stream properly. Thanks for 'forcing' me to look at the AjaxUpload code online :) -Mihir. On Thu, Jul 16, 2015 at 2:11 PM, Martin Grigorov <[email protected]> wrote: > Hi, > > You cannot stream binary data in the Ajax response. > Wicket-ajax.js expects XML response. > > Check > > https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow > for a description how to accomplish your task. > > Martin Grigorov > Freelancer. Available for hire! > Wicket Training and Consulting > https://twitter.com/mtgrigorov > > On Thu, Jul 16, 2015 at 8:36 PM, Mihir Chhaya <[email protected]> > wrote: > > > Hello, > > > > Could anybody guide me on following? > > > > I am using SelectableFolderContent from Wicket Advanced Tabular Tree > > structure example (TableTreePage). > > > > Here is what I am trying: > > > > 1. Using JCraft - JSch, establish connection to the host, traverse the > > folder structure, prepare list of file path-name, file size, file type > etc. > > - This is working. > > 2. Display the list on the tabular tree structure - This is working. > > 3. On click of the link of each folder, expand and collapse the folder > > structure - Working. > > 4. On click of the file, zip the file and create into default temp folder > > of the running server- Working. > > > > 5. At the same time when clicked, open download file dialog box to > download > > the zip file from the server to local machine - Not working. > > > > Here is my SelectableFolderContent class. 'downloadFile(...)' method call > > in from select(...) is where I am trying to download using > IResourceStream. > > > > public class SelectableFolderContent extends Content { > > > > private static final long serialVersionUID = 1L; > > > > private ITreeProvider<SomeFileBean> provider; > > > > private IModel<SomeFileBean> selected; > > > > public SelectableFolderContent(ITreeProvider<SomeFileBean> provider) > { > > this.provider = provider; > > } > > > > @Override > > public void detach() { > > if (selected != null) { > > selected.detach(); > > } > > } > > > > protected boolean isSelected(SomeFileBean someFile) { > > IModel<SomeFileBean> model = provider.model(someFile); > > > > try { > > return selected != null && selected.equals(model); > > } finally { > > model.detach(); > > } > > } > > > > protected void select(SomeFileBean someFile, > AbstractTree<SomeFileBean> > > tree, final AjaxRequestTarget target) { > > > > if (!someFile.isFolder()) { > > //SFTP to host, get file, create zip in temp folder. Once done, download > to > > local machine. > > downloadFile(tree.getPage(), someFile, target); > > } else { > > > > if (selected != null) { > > tree.updateNode(selected.getObject(), target); > > > > selected.detach(); > > selected = null; > > } > > > > selected = provider.model(someFile); > > > > if (tree.getState(selected.getObject()) == > > AbstractTree.State.COLLAPSED) { > > tree.expand(selected.getObject()); > > } else { > > tree.collapse(selected.getObject()); > > } > > tree.updateNode(someFile, target); > > > > tree.getPage().setResponsePage(SomeTableTreePage.class); > > } > > } > > > > > > @Override > > public Component newContentComponent(final String id, final > > AbstractTree<SomeFileBean> tree, final IModel<SomeFileBean> model) { > > > > Folder<SomeFileBean> components = new Folder<SomeFileBean>(id, > > tree, model) { > > private static final long serialVersionUID = 1L; > > > > @Override > > protected IModel<?> newLabelModel(IModel<SomeFileBean> > model) { > > return new PropertyModel<String>(model, "id"); > > } > > > > /** > > * Always clickable. > > */ > > @Override > > protected boolean isClickable() { > > return true; > > } > > > > @Override > > protected void onClick(AjaxRequestTarget target) { > > SelectableFolderContent.this.select(modelObject, tree, > > target); > > } > > > > @Override > > protected boolean isSelected() { > > return > > SelectableFolderContent.this.isSelected(getModelObject()); > > } > > > > }; > > > > return components; > > } > > protected void downloadFile(final Page page, SomeFileBean someFile, > > AjaxRequestTarget target) { > > IModel<File> fileModel = getDownloadFileModel(someFile); > > file = fileModel.getObject(); > > IResourceStream resourceStream = new FileResourceStream(new > > org.apache.wicket.util.file.File(file)); > > String fileName = "serverlog.zip"; > > > > ResourceStreamRequestHandler resourceStreamRequestHandler = new > > ResourceStreamRequestHandler( > > resourceStream, fileName); > > > > > > > page.getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); > > > > > > try { > > resourceStream.close(); > > } catch (IOException e) { > > AppLogger.logMessage(AppLogger.LEVEL.ERROR, "File I/O > Error:", > > e); > > } catch (Exception e) { > > AppLogger.logMessage(AppLogger.LEVEL.ERROR, "Error:", e); > > } > > } > > } > > > > > > There are two issues I am experiencing: > > 1. Dialog box not opening to save the file on local machine. > > 2. When debugging, the Ajax Debug window showing > 'Wicket.Ajax.Call.failure: > > Error while parsing response: Error: Invalid XML' error. > > > > Thanks in advance, > > -Mihir. > > >
