2013-01-11 14 views
5

Quindi quello che ho è uno DataView con tre colonne, una delle quali è una colonna checkbox che consente agli utenti di controllare quali file vorrebbero scaricare.Wicket: download di file dopo un onSubmit

Per semplicità (credo); Ho deciso di comprimere i file in un unico file zip e di servirlo dopo che è stato generato.

Ecco quello che ho finora:

Codice::


Button downloadLogButton = new Button("downloadlogbutton") { 
     private static final long serialVersionUID = 1L; 
     @Override 
     public void onSubmit() { 
      // Some utility class I made that zips files 
      LogUtility util = new LogUtility(); 
      util.zipLogFiles("sample", logs); 
     } 
    }; 

    Form logsForm = new Form("logsform") { 

    }; 

    logsForm.add(downloadLogButton); 

    CheckGroup<File> checkGroup = new CheckGroup<File>("logscheckgroup", new ArrayList<File>()); 
    WebMarkupContainer logsViewContainer = new WebMarkupContainer("datatable"); 
    DataView<File> logsView = new DataView<File>("logrows", new ListDataProvider<File>(logs)) { 

     private static final long serialVersionUID = 1L; 

     public void populateItem(final Item<File> item) { 
      final File file = (File) item.getModelObject(); 
      item.add(new Check<File>("logdownloadcheck", item.getModel())); 
      item.add(new Label("logname", file.getName())); 
      SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy hh:mm a"); 
      item.add(new Label("logdatemodified", sdf.format(file .lastModified()))); 
     } 
    }; 

    logsViewContainer.add(logsView); 
    checkGroup.add(logsViewContainer); 
    logsForm.add(checkGroup); 
    add(logsForm); 

Come posso servire il file zip dopo che è stato generato per il download? Quali sono le mie opzioni? Mi piacerebbe evitare di dover reindirizzare a una pagina di conferma o una pagina Your download is ready.

UPDATE

Sulla base di Xavi López risposta, ho aggiunto il seguente codice nella onSubmit funzione S' miei Button.

org.apache.wicket.util.file.File log = new org.apache.wicket.util.file.File("/home/keeboi/Downloads/sample.zip"); 

IResourceStream resourceStream = new FileResourceStream(log); 
IRequestHandler target = new ResourceStreamRequestHandler(resourceStream); 

getRequestCycle().scheduleRequestHandlerAfterCurrent(target); 

E sto ricevendo HTTP Error 404: Not Found.

risposta

5

Si può fare esattamente come DownloadLink e creare un file FileResourceStream dal file zippato. Poi, basta cambiare l'obiettivo della corrente ciclo di richiesta:

Button downloadLogButton = new Button("downloadlogbutton") { 
    private static final long serialVersionUID = 1L; 
    @Override 
    public void onSubmit() { 
     // Some utility class I made that zips files 
     LogUtility util = new LogUtility(); 
     util.zipLogFiles("sample", logs); 
     IResourceStream resourceStream = new FileResourceStream(
      new org.apache.wicket.util.file.File(someFile)); // Use whatever file you need here 
     IRequestTarget t = new ResourceStreamRequestTarget(stream){ 
      @Override 
      public String getFileName() { 
       return "filename.zip"; 
      } 
     } 
     getRequestCycle().setRequestTarget(t); 
    } 
}; 

Se si voleva eliminare il file dopo il download, è possibile ignorare IRequestTarget#respond(RequestCycle) come questo:

@Override 
public void respond(RequestCycle requestCycle) { 
    super.respond(requestCycle); 
    // Delete the file 
    ((FileResourceStream)getResourceStream()).getFile().delete(); 
} 

La domanda relativa potrebbe anche essere utile: How to use Wicket's DownloadLink with a file generated on the fly?.

+1

Dal momento che sto usando Wicket 1.5, l'ho fatto in questo modo: 'org.apache.wicket.util.file.File log = new org.apache.wicket.util.file.File ("/home/keeboi/download/sample.zip "); IResourceStream resourceStream = new FileResourceStream (log); IRequestHandler target = new ResourceStreamRequestHandler (resourceStream); getRequestCycle(). ScheduleRequestHandlerAfterCurrent (target); ' Ma sto ricevendo' Errore HTTP 404: Non trovato ' –

+0

Ok, è stato un errore nella mia classe di utilità. Grazie! –