GWT:从客户端下载文件,无需服务器干预

Posted

技术标签:

【中文标题】GWT:从客户端下载文件,无需服务器干预【英文标题】:GWT : Download file from client side without server intervention 【发布时间】:2014-09-08 06:52:58 【问题描述】:

我在 UI 中显示了用户信息,用户可以将其作为文件下载。当用户单击下载时,我想将客户端中存在的信息写入文件并使其可下载。所以所有的下载功能都应该紧贴客户端,没有任何服务器干预。我遇到了这篇文章,

1) How can a user download a file in client side (Google Web Toolkit)

但没有多大帮助。

谢谢。

【问题讨论】:

你不能。这是所有流行浏览器使用的 javascript 引擎的限制。这是由于安全问题。您不希望未知的 javascript 写入您的文件系统,对吗? Related @Baz :最好的方法是什么?使用 servlet?。 是的,我就是这么做的。 @Baz : 你能提供样品吗? 【参考方案1】:

您不能写入文件,但您可以创建一个 blob(使用字符串或 类型化数组)并获取该 blob 的 URL 以创建它可下载(只需将该 URL 作为链接的href,可能添加download 属性以强制下载)。

目前,GWT 支持类型化数组(仅当您需要二进制而不是文本时才真正有用),但不支持 blob,因此您必须使用 JSNI(或者可能是 GWT Elemental)。

有关浏览器兼容性,请参阅http://caniuse.com/#feat=blobbuilder 和 http://caniuse.com/#feat=blobbuilder、http://caniuse.com/#feat=bloburls 和 http://caniuse.com/#feat=download

注意:还有其他涉及 Flash 或其他插件的解决方案,但浏览器兼容性不会更好(您会使用旧版浏览器,但可能会丢失新版浏览器,尤其是当人们越来越多地切换到“点击播放”时" 插件模式)。

【讨论】:

【参考方案2】:

如果文件不是太大,您可以使用 data URI 方案作为

button.setAttribute("download", "filename.ext");    
String url = "data:Application/octet-stream;base64," + dataAsBase64;
button.setHref(url);

我在http://jsfiddle.net/cn1ckawL/做了一个小提琴

【讨论】:

以上是关于GWT:从客户端下载文件,无需服务器干预的主要内容,如果未能解决你的问题,请参考以下文章

使用 GWT RemoteServiceServlet 下载文件

生成动态文件并在 GWT 中下载

在 GWT 中从服务器向客户端发送文件

在 GWT 中下载时使用 servlet 发送字符串

GWT-Rpc如何返回文件让浏览器弹出下载对话框

从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件