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.
> >
>

Reply via email to