嗨,有可能通过传递列表作为参数从服务器下载文件
使用RestyGWT和Jersey 1.7吗?
在服务器端,我有以下Web服务
@POST
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("/download")
public Response downloadFiles(@Context HttpServletResponse response, List<FileInfo> files) {
ZipFile zip = null;
String uuid = UUID.randomUUID().toString();
response.setHeader("Content-Disposition", "attachment; filename="
+ uuid + ".zip");
try {
zip = new ZipFile(response.getOutputStream());
File f = new File(ConfigurationLoader.getRealPath("/logo.png"));
zip.addFile(f, "");
zip.getOutputStream().flush();
zip.getOutputStream().close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
当我在浏览器中键入localhost:8080 / Url / download时,它可以工作,但是如何使用Resty Gwt或通过Window.open()下载文件?
我想使用POST而不是GET,因此我可以传递可序列化对象的列表,例如:List files。
我在RestyGWT的客户端上尝试过:
@POST
@Produces("application/zip")
@Path("/download")
public void downloadFiles(List<FileInfo> files, MethodCallback<Response> response);
private static final Resource resource = new Resource(
GWT.getHostPageBaseURL() + "rest/files");
public static final FileRestService get() {
if (instance == null) {
instance = GWT.create(FileRestService.class);
((RestServiceProxy) instance).setResource(resource);
}
return instance;
}
但它不起作用,我找不到在restygwt中下载文件的示例
通常(*),您不能使用Ajax下载文件,因此必须使用aWindow.open()
或aniframe
来要求用户将文件另存为。
看一下我在此查询中的响应:GWT中的Window.open在回调函数中无法正确打开
当然,使用iframe不能使用POST,但是您可以编写循环以在每次加载最后一个iframe时请求一个不同的文件。将询问用户与要下载的文件一样多的次数。
您可以使用FormPanel
尽管,然后添加一些隐藏的参数并将其发布到服务器。FormPanel在隐藏的iframe中显示响应,因此设置适当的标题(内容类型content-disposition)可以下载文件并要求用户另存为。我会压缩文件集,以便用户可以保存或打开内容,因为更多的操作系统都有实用程序来可视化压缩文件。
(*)使用XHR可以下载文件,但是您需要一种处理内容并将其显示给用户的方法。通常用于文本文件html,txt,xml等。请看一下html5 api来接收和处理二进制数据。但是,您不能在用户的文件系统中创建文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句