我正在开发一个 GWT 应用程序。此应用程序正在服务器中运行。好吧,我实现了一个按钮,它调用一个在服务器端生成本地文件的方法。但是我想在客户端下载/生成这个文件。我怎么能在 GWT 中做到这一点?
谢谢
在我们的项目中,我们按需在服务器上创建了一个文件。当文件成功创建后,我们向浏览器发送通知并创建一个链接。
请参阅 servlet 代码:
public class DownloadServlet extends HttpServlet {
private FileManager fileManager;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String encodedFileName = req.getRequestURI().substring(
req.getContextPath().length() + req.getServletPath().length() + 1);
String decodedFileName = URLDecoder.decode(encodedFileName, "utf-8");
File downloadableFile = fileManager.toFile(decodedFileName);
ServletOutputStream os = resp.getOutputStream();
try {
InputStream is = FileUtils.openInputStream(downloadableFile);
try {
IOUtils.copy(is, os);
} finally {
is.close();
}
} finally {
os.close();
}
}
}
目前的情况是,并不是所有的浏览器都能够使用本地文件系统,所以在 GWT 中没有通用的解决方案。据我所知,FileSstem API 还没有完成。
作为替代方案,您可以继续使用服务器端生成的文件,或使用 Flash 插件来生成和存储文件(您必须创建一个 Flash 应用程序,并创建一些 API 来从 GWT 控制它)。
private native void Download(String filename, String text)/*-{
var pom = document.createElement('a');
pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
pom.setAttribute('download', filename);
document.body.appendChild(pom);
pom.click();
document.body.removeChild(pom); }-*/;
在GWT代码中使用JSNI方法,除了JSON 字符串之外,还提供要下载的文件名作为文本(String),该方法会将文本变量中指定内容的文件下载到客户端浏览器。
您绝对应该看看Aki Miyazaki 的 GWT 的 HTML5 文件下载代码。它按照您的要求在客户端工作。
AFAIK,截至目前,它仅适用于 Chrome,但这应该会随着其他浏览器实现download 属性而改变。