假设我们使用的是 HTML 4。
GWT 客户端无法“读取”文件。GWT 客户端是在浏览器上运行的 javascript。浏览器安全不允许您读取本地文件。您必须让 servlet 代理读取服务器上的文件。
您设置文件的 mime 类型是因为您希望浏览器下载文件并调用本地 PC 来调用适当的软件 - 例如,pdf 来调用 pdf 阅读器或 xls 来调用 ms excel。与 GWT Java 或 Javascript 无关(启用下载除外)。
为什么需要 GWT 客户端来读取二进制文件?如果你这样做了,你的架构可能是错误的。“错”是个不客气的词。也许,错位是一个更好的词。您对 AJAX 瘦客户端-服务器的概念是错位的。一进GWT的大门,就把你的桌面处理理念和习惯丢在门口。
GWT 是 Java 但不是 Java
我一直不得不提醒人们,GWT Java 只是 Javascript 的一种更连贯的表示。当您使用 GWT Java 进行编码时,请始终记住您实际上是在使用 Javascript 而不是 Java 进行编码。所有 Java 源代码都被翻译成 Javascript
因此,GWT 编译器需要在源代码中提供所有 Java 类。GWT 编译器无法将 Java 字节码 jar/类文件翻译成 Javascript。如果您的库在字节码中,或者您的源库在调用链的任何位置调用字节码库,则编译将失败。
服务器端和客户端 GWT 之间的混淆
GWT RPC 有时会让 GWT 新手感到困惑。他们似乎没有意识到远程 servlet 是唯一被编译成字节码的部分,因为它是在服务器上运行的。特别是如果您使用的是 Vaadin - 因为他们故意模糊了服务器和浏览器之间的界限。所以 GWT 新手开始想,“为什么我的字节码库只在应用程序的某些部分工作?”
ajax 客户端服务器架构
GWT 只是一个支持 Web 的 UI。为什么你不能在服务器上做任何你想做的事情,让服务器反映它正在做什么或已经对 UI 做了什么?为什么一定要在浏览器上完成?
想象一下您的 GWT 接口是一个增强的 JSP。假设您正在编写一个 JSP。您是否让您的 JSP 将您的二进制数据吸入浏览器并让 JSP 生成 Javascript 以分析那里的二进制数据?
我编写了复杂的统计分析,我只是将浏览器用作服务器上正在执行的操作的反映。工程师认为他/她正在他/她的 PC 上运行分析。生成图表/报告。但这一切都是通过调用SAS在服务器上完成的。
面向服务的模式/架构
您的服务器将提供服务。您的浏览器 GWT 客户端将请求这些服务。打开文件,读取文件,分析文件,生成分析的可视化/mime 表示并将其传递给浏览器。只需将 GWT 浏览器客户端视为基于服务器的操作的显示监视器。GWT 是一个魔术师的把戏,可以帮助我变出幻觉,让工程师感觉他们正在本地 PC 上执行分析。当然,作为工程师,他们中的大多数人都知道浏览器实际上并没有在做这项工作。
当您的用户对分析感到满意时,让您的服务生成结果的 mime 表示,以便浏览器可以下载它以调用 mime 映射的适当本地 PC 软件。
在服务器上执行并将其反映在浏览器上。
进一步编辑:关于二进制数据......
在 Web 应用程序中使用 base64 编码背后的动机:身份验证令牌、图片、音频文件的传输——这样它们的二进制表示和排序就不会被字节序等架构细微差别弄乱。
例如,不要尝试编写浏览器应用程序来读取原始二进制电子表格 - 始终让服务器将其转换为 XML 或 JSON(最好是 JSON),其中任何二进制元素都应进行 base64 编码,然后再将其发送到浏览器应用程序。或者,如果您的人生目标是攀登珠穆朗玛峰,请发明一种与架构无关的编码来代替 base64 来传输二进制数据。
如果用于浏览器的操作系统处理(如音频、图片、pdf),则仅使用二进制信息。发送仅由 javascript 例程处理的二进制数据毫无意义。javascript 例程将不得不使用无关的处理时间来翻译它(除非再一次,如果你的生活目标是攀登......)。