java - txt - Wicket: descarga de archivos después de una presentación
descargar varios archivos java (1)
Puede hacer simplemente como DownloadLink
y crear un FileResourceStream
desde el archivo comprimido. Luego, simplemente cambie el objetivo del ciclo de solicitud actual:
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);
}
};
Si desea eliminar el archivo después de la descarga, puede anular IRequestTarget#respond(RequestCycle)
esta manera:
@Override
public void respond(RequestCycle requestCycle) {
super.respond(requestCycle);
// Delete the file
((FileResourceStream)getResourceStream()).getFile().delete();
}
La siguiente pregunta relacionada también podría ser útil: ¿Cómo usar Wicket''s DownloadLink con un archivo generado sobre la marcha? .
Entonces, lo que tengo es un DataView
con tres columnas, una de las cuales es una columna de casilla de verificación que permite a los usuarios verificar qué archivos les gustaría descargar.
Por simplicidad (creo); Decidí comprimir los archivos en un único archivo comprimido y publicarlo después de que se haya generado.
Esto es lo que tengo hasta ahora:
Código :
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);
¿Cómo sirvo el archivo zip después de que se genera para descargar? ¿Cuáles son mis opciones? Me gustaría evitar tener que redirigirlos a una página de confirmación o una página Your download is ready
.
ACTUALIZAR
Basado en la respuesta de Xavi López, agregué el siguiente código en la función de onSubmit
mi 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);
Y HTTP Error 404: Not Found
.