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